【发布时间】:2021-02-06 20:21:21
【问题描述】:
尝试用 Stream API 中的匿名类替换 lambdas(如下代码),它工作正常。我想了解 test(T t) 方法所需的参数是如何生成的。
拉姆达
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 的简化实现
【问题讨论】:
-
是的,它可以在 Java 7 中使用匿名类。 (一些第三方库正是这样做的,例如 Guava 的 FluentIterable。)
-
好的,谢谢。那么它是负责此功能的 Fluent API 吗?
-
我的意思是,真正负责的不是“流利的 API”。只是……这些语言功能是如何工作的。
-
好的,java中的哪个特性,方法链?但是我没有看到这里使用了这个关键字,它通常用于方法链接。
-
方法链实际上并不是一种语言特性,它只是一种使用语言的方式。它实际上与
Predicate的使用完全无关。this的使用也不是实现方法链接的必要条件。
标签: java lambda java-8 java-stream fluent