Я работал с CompletableFutures
, когда столкнулся с ситуацией. Допустим, я хотел сделать некоторую очистку после завершения асинхронной операции. Есть ли важная разница между вызовом функции-члена таким образом? Почему я предпочел бы первый пример второму?
Возьмите эти два примера:
someAsyncOperation.apply(foo).whenComplete(MyClass::handleOperationCompletion);
Против:
someAsyncOperation.apply(foo).whenComplete((results, ex) -> handleOperationCompletion(results, ex));
Вызов статической функции из анонимной функции позволяет мне добавить дополнительные аргументы в локальную область. Во втором случае я мог бы добавить локальную переменную:
final Closeable object = new SomeCloseable();
someAsyncOperation.apply(foo).whenComplete((results, ex) -> handleOperationCompletion(results, ex, object));
Я чувствую, что это может быть полезно, если мне нужно сохранить контекст для какого-либо объекта для выполнения очистки (например, закрыть поток), и я все еще могу написать для него модульные тесты. Есть ли компромисс, который мне здесь не хватает?
whenComplete
вы вызываетеhandleOperationCompletion
один раз как статический метод, а другой вариант — как метод-член. Тот факт, что он обернут лямбдой, - это просто техническая деталь, но я не вижу, как это на что-то влияет. Итак, в конце концов, похоже, вы спорите о том, сделать ли метод статическим или нет... - person Nir Alfasi   schedule 20.03.2017