У меня есть пример кода, который использует Java 8 new stream functionality (получите диапазон значений int 1 .. 20, пропустите первые 9, затем возьмите оставшиеся 10, каждое значение int: уменьшите на единицу и умножьте на 2). Анонимный класс заменен на лямбда-выражения
System.out.println(Arrays.toString(
IntStream.rangeClosed(1, 20).skip(9).limit(10).map((new IntUnaryOperator() {
@Override
public int applyAsInt(int operand) {
return operand - 1;
}
}).andThen(new IntUnaryOperator() {
@Override
public int applyAsInt(int operand) {
return operand * 2;
}
})).toArray()));
Выход следующим образом:
[18, 20, 22, 24, 26, 28, 30, 32, 34, 36]
Теперь я хочу, чтобы заменить анонимные классы с Lambda expressions. Следующее преобразование работает отлично (второй анонимный класс заменяется выражением i -> i * 2
лямбда), и я получаю тот же результат:
System.out.println(Arrays.toString(
IntStream.rangeClosed(1, 20).skip(9).limit(10).map((new IntUnaryOperator() {
@Override
public int applyAsInt(int operand) {
return operand - 1;
}
}).andThen(i -> i * 2)).toArray()));
Однако, когда я заменить первый анонимный класс с лямбда-выражения:
System.out.println(
Arrays.toString(
IntStream.rangeClosed(1, 20).skip(9).limit(10)
.map((v -> v - 1).andThen(i -> i * 2)).toArray()));
Я не могу скомпилировать свой код. Ошибка говорит Operator '-' cannot be applied to '<lambda parameter>', 'int'
Вы знаете, как объединить два лямбда-выражения с IntUnaryOperator.andThen
?
Я знаю, что могу использовать ... .limit(10).map(v -> v - 1).map(i -> i * 2).toArray() ...
, который отлично работает, но я хотел бы узнать, как использовать IntUnaryOperator.andThen
с lambdas (если это возможно).
Интересный вопрос! Также более формальный '((int v) -> v - 1).andThen ((int i) -> i * 2) 'не работает:" ошибка: выражение lambda не ожидается здесь ". – isnot2bad
компилятор не может вывести тип '(v -> v - 1) .andThen (i -> i * 2)', поскольку на самом деле он должен сделать 2 вывода, а затем третий из этих двух. это, скорее всего, выходит за рамки системы типов. – aepurniet