У меня есть пример кода, который использует Java 8 новую функцию потока (получите диапазон значений 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]
Теперь я хочу заменить анонимные классы лямбда-выражениями. Следующее преобразование работает отлично (второй анонимный класс заменен выражением 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 (если это возможно).