相关疑难解决方法(0)

按谓词查找第一个元素

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

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

lst.stream()
    .filter(x -> x > 5)
    .findFirst()
Run Code Online (Sandbox Code Playgroud)

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

java java-8 java-stream

478
推荐指数
5
解决办法
36万
查看次数

了解java 8 stream的过滤方法

我最近Stream在Java 8 中学到了s并看到了这个例子:

IntStream stream = IntStream.range(1, 20);
Run Code Online (Sandbox Code Playgroud)

现在,让我们说我们想找到第一个可分为3和5的数字.我们可能filter两次,findFirst如下:

OptionalInt result = stream.filter(x -> x % 3 == 0)
                               .filter(x -> x % 5 == 0)
                               .findFirst();
Run Code Online (Sandbox Code Playgroud)

这听起来很合理.当我尝试这样做时出现了令人惊讶的部分:

OptionalInt result = stream.filter(x -> {System.out.println(x); return x % 3 == 0;})
                           .filter(x -> {System.out.println(x); return x % 5 == 0;})
                           .findFirst();

System.out.println(result.getAsInt());
Run Code Online (Sandbox Code Playgroud)

我希望得到类似的东西:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20然后:3 …

java filter java-8 java-stream

5
推荐指数
1
解决办法
1369
查看次数

标签 统计

java ×2

java-8 ×2

java-stream ×2

filter ×1