【发布时间】:2013-11-29 14:06:56
【问题描述】:
我有使用 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 lambda 表达式),我得到相同的输出:
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()));
但是,当我用 lambda 表达式替换第一个匿名类时:
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'
你知道如何将两个 lambda 表达式与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 表达式”。 -
编译器无法推断
(v -> v - 1).andThen(i -> i * 2)的类型,因为它实际上必须进行 2 次推断,然后在这两次推断中进行三分之一。它很可能超出了类型系统的范围。
标签: java lambda anonymous-class java-8