尝试在Stream API中用匿名类替换lambdas(下面的代码(,效果很好。我想了解test(T(方法所需的参数是如何生成的。
Lambda
list.stream()
.map(String::length)
.filter(t->t>4).count();
匿名类
list.stream()//line1
.map(String::length)
.filter(new Predicate<Integer>() {
@Override
public boolean test(Integer t) {//line 5
return t>4;
}
}).count();
在使用lambda时,我们使用lambda表示法传递参数,但我不明白第5行的Integer t
是如何生成的。是由于Stream
中的Fluent API
还是由于功能接口(lambda(?
编辑:我很清楚lambda
版本,不明白带anonymous class
的版本是如何工作的?换句话说,它在Java 1.7
中工作吗(如果我们写了类似于Stream API
的东西,我们就不会有lambdas了(。
编辑:对于任何像我一样困惑的人,请查看https://github.com/fmcarvalho/quiny,一些聪明人简化了Stream API的实现
当您编写t -> t > 4
时,Java会自动推断出这个lambda的类型——它必须是Predicate<Integer>
,假设它是在Stream<Integer>
上传递给filter
的——然后自动计算出它一定是(Integer t) -> t > 4
。