小编典典

按谓词查找第一个元素

all

我刚刚开始使用 Java 8 lambda,我正在尝试实现一些我在函数式语言中习惯的东西。

例如,大多数函数式语言都有某种查找函数,它对序列或返回第一个元素的列表进行操作,谓词是true. 我能看到在 Java 8 中实现这一点的唯一方法是:

lst.stream()
    .filter(x -> x > 5)
    .findFirst()

然而,这对我来说似乎效率低下,因为过滤器将扫描整个列表,至少在我看来(这可能是错误的)。有没有更好的办法?


阅读 107

收藏
2022-03-06

共1个答案

小编典典

不,过滤器不会扫描整个流。它是一个中间操作,它返回一个惰性流(实际上所有中间操作都返回一个惰性流)。为了说服您,您可以简单地进行以下测试:

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

您会看到实际上只处理了流的前两个元素。

因此,您可以采用非常好的方法。

2022-03-06