"Можно ли использовать метод по умолчанию в лямбда-выражении?"Да.Фактически, многие функциональные интерфейсы содержат методы по умолчанию.Вам нужен один и только один абстрактный метод в интерфейсе, чтобы он был функциональным интерфейсом, в противном случае были бы другие методы интерфейса, «не реализованные» лямбда-выражением, что недопустимо.Но вот как могут применяться значения по умолчанию.Приведенный ниже интерфейс BiFunction
был извлечен из исходников API, без JavaDoc.
Следующий код работает, потому что BinaryOperator
и UnaryOperator
расширяют BiFunction
и Function
соответственно.
BinaryOperator<Integer> add = (numb1,numb2)->numb1+numb2;
UnaryOperator<Integer> mul = resultFromAdd->resultFromAdd*20;
BinaryOperator<Integer> addThenMul = (numb1,numb2) ->add.andThen(mul).apply(numb1,numb2);
int result = addThenMul.apply(10,20); // produces (10+20)*20 = 600
Следующее было поднято из исходных файлов Java API.
@FunctionalInterface
public interface BiFunction<T, U, R> {
R apply(T t, U u);
default <V> BiFunction<T, U, V> andThen(
Function<? super R, ? extends V> after) {
Objects.requireNonNull(after);
return (T t, U u) -> after.apply(apply(t, u));
}
}
В приведенном выше примере кода я мог бы использовать BiFunction<Integer,Integer,Integer>
и Function<Integer,Integer>
.Но расширения *Operator
предполагают одинаковый тип для всех аргументов, поэтому их проще использовать (т. Е. Меньше вводить).