我刚刚开始使用Java 8 lambdas,我正在尝试实现我在函数式语言中习惯的一些东西.
例如,大多数函数式语言都有某种类型的查找函数,这些函数对序列进行操作,或者列表返回谓词所在的第一个元素true.我在Java 8中实现这一目标的唯一方法是:
lst.stream()
.filter(x -> x > 5)
.findFirst()
Run Code Online (Sandbox Code Playgroud)
然而这对我来说似乎效率低下,因为过滤器会扫描整个列表,至少根据我的理解(这可能是错误的).有没有更好的办法?
我最近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 …