我刚刚开始使用Java 8 lambda,并且正在尝试实现一些我在函数式语言中惯用的东西。
例如,大多数功能语言都具有某种对序列进行操作的find函数,或者对返回谓词为的第一个元素的列表进行操作true
。我看到的在Java 8中实现此目标的唯一方法是:
lst.stream()
.filter(x -> x > 5)
.findFirst()
但是,这对我来说似乎效率很低,因为过滤器将扫描整个列表,至少在我看来(可能是错误的)。有没有更好的办法?
53
它不是低效的,Java 8 Stream实现是延迟评估的,因此过滤器仅应用于终端操作。同样的问题在这里:stackoverflow.com/questions/21219667/stream-and-lazy-evaluation
—
Marek Gregor 2014年
凉。那就是我希望的。否则,它将是一个主要的设计失败。
—
斯基
如果您的目的实际上是检查列表中是否包含这样的元素(不单挑其中的第一个元素),则.findAny()在并行设置中理论上可以更有效,并且当然可以更清楚地传达此意图。
—
Joachim Lous
与简单的forEach周期相比,这将在堆上创建许多对象以及数十个动态方法调用。尽管这可能并不总是影响性能测试的底线,但在热点地区,请避免使用琐碎的Stream和类似的重量级结构。
—
Agoston Horvath