Java 8:在API中传递流以进行惰性操作的良好实践?


12

在像Guava这样的Java 8之前的lambda繁重库中,输出使用通用的Java Collection Framework接口,因此很容易将它们传递给外部/内部API,并且如果库方法做到了,则仍然可以利用一些惰性计算(例如lazy filter()transform())。

但是,在Java 8 Streams中,获取Collection/ 的调用Map是终端(即渴望),并且还将分配新的数据结构来保存结果。

对于中间具有多个阶段和策略模式的复杂计算,由于中间结果,这会导致很多不必要的分配。

因此,人们是否认为采用内部API(即策略模式策略)并返回Streams 是一个好习惯,还是我应该退后到懒惰的Guava API而不精简(我想是双关语)?

编辑:

我主要关心的Stream是它只能被消费一次并传递Supplier<Stream<X>>看起来非常笨拙的东西。它几乎迫使您只通过a Collection然后重新stream()通过(并为此付出了急切的评估费用)。


什么,番石榴和朋友没有更新以利用本地流?
Kilian Foth,2015年

1
具有接收和返回流的接口确实可以提高与标准流功能的互操作性。它允许您将对接口的调用集成到流管道中。
菲利普

@KilianFoth近一年来没有发布任何Guava版本,有很多关于用Stream替换Guava的lambda东西的热门文章。但是,它们都没有解决Guava收集操作可能渴望或懒惰的事实。
billc.cn 2015年

Answers:


3

Java 8 Streams中的惰性与Guava中Iterables的工作原理相同:一旦从Iterator构建了Collection,您就必须传递Iterable才能保持懒惰并进行评估。流和迭代器都只能使用一次。

因此,对于您的方法接口,更通用的方法(允许延迟)是使用Stream接口(之前曾经使用过Iterable的情况)。正如@Philipp所说,这允许它们在Stream管道中使用。

希望,由于Stream现在是Java的正式标准接口,因此将会有越来越多的其他库和函数可以直接在Streams上有效地工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.