我刚刚开始使用 Java 8 lambda,我正在尝试实现一些我在函数式语言中习惯的东西。
例如,大多数函数式语言都有某种查找函数,它对序列或返回第一个元素的列表进行操作,谓词是true. 我能看到在 Java 8 中实现这一点的唯一方法是:
true
lst.stream() .filter(x -> x > 5) .findFirst()
然而,这对我来说似乎效率低下,因为过滤器将扫描整个列表,至少在我看来(这可能是错误的)。有没有更好的办法?
不,过滤器不会扫描整个流。它是一个中间操作,它返回一个惰性流(实际上所有中间操作都返回一个惰性流)。为了说服您,您可以简单地进行以下测试:
List<Integer> list = Arrays.asList(1, 10, 3, 7, 5); int a = list.stream() .peek(num -> System.out.println("will filter " + num)) .filter(x -> x > 5) .findFirst() .get(); System.out.println(a);
哪个输出:
will filter 1 will filter 10 10
您会看到实际上只处理了流的前两个元素。
因此,您可以采用非常好的方法。