【发布时间】:2017-05-28 12:28:19
【问题描述】:
最近我在学习 Java 8 的特性,所以我从一个 lambda 表达式开始,然后我遇到了 Java 流 API,现在我正试图围绕流 API 中的方法,它们是如何工作的?
我对 lambda 表达式的理解是,如果我们想将 lambda 表达式传递给方法,那么我们需要使用与 lambda 表达式的签名匹配的单个未实现方法(Java 8 接口可以具有默认实现)创建一个接口.那么lambda表达式被传递到的方法可以通过调用接口方法来执行lambda表达式。所以我可以说 lambda 表达式作为接口方法的实现。
但是当我看到 Stream API 时,它有一些改变流的方法,例如下面的代码只是通过过滤小于 5 的整数来打印整数。
import java.util.Arrays;
import java.util.List;
public class StreamDemo {
static List<Integer> list= Arrays.asList(new Integer(1), new Integer(2), new Integer(3), new Integer(4), new Integer(5), new Integer(6));
public static void main(String[] ar) {
list.parallelStream()
.filter( x-> x<5)
.forEach(System.out::print);
}
}
但我不明白,过滤器是如何工作的,因为它没有实现,我试图从 Intellij 中查看实现,它将我带到 Stream 接口,其中过滤器是非实现方法,它采用参数 Predicate 引用,但是没有谓词方法boolean test(T t);的方法调用那么Java如何评估结果,同样有方法distinct没有实现但仍然给我准确的结果。
提前致谢。
【问题讨论】:
-
filter确实有一个实现,在这种情况下,它由parallelStream()返回的Stream实例提供。您可以通过单击定义旁边空白处的绿色小箭头找到接口方法的所有实现。 -
感谢您的快速提示,但我无法导航到不同的方法定义
-
@AkshayNaik 你不需要知道哪个类实现了这个方法,以及它是如何实现的。您只需要知道一个 Stream,无论它的具体实现是什么,都有一个 distinct() 方法,该方法的工作原理与 Stream 接口的 javadoc 中的文档一样。
标签: java intellij-idea lambda java-8 java-stream