【发布时间】:2014-07-04 23:13:45
【问题描述】:
我刚刚开始使用 Java 8 lambda,我正在尝试实现一些我习惯于使用函数式语言的东西。
例如,大多数函数式语言都有某种查找函数,它对序列或返回第一个元素的列表进行操作,谓词为true。我认为在 Java 8 中实现这一目标的唯一方法是:
lst.stream()
.filter(x -> x > 5)
.findFirst()
但这对我来说似乎效率低下,因为过滤器将扫描整个列表,至少在我看来(这可能是错误的)。有没有更好的办法?
【问题讨论】:
-
效率不低,Java 8 Stream 实现是惰性求值的,所以过滤器只适用于终端操作。同样的问题:stackoverflow.com/questions/21219667/stream-and-lazy-evaluation
-
酷。这就是我希望它会做的事情。否则,这将是一次重大的设计失败。
-
如果您的意图真的是检查列表是否包含这样的元素(而不是挑出可能的几个元素中的第一个), .findAny() 理论上可以在并行设置中更有效,并且当然可以更清楚地传达这种意图。
-
与简单的 forEach 循环相比,这将在堆上创建大量对象和数十个动态方法调用。虽然这可能并不总是影响您的性能测试的底线,但在热点中,避免使用 Stream 和类似的重量级结构会有所不同。
标签: java java-8 java-stream