我应该在界面上公开Stream 吗?
如果我正在编写.NET代码,我会经常公开IEnumerable
– 它可能有意义。 也许这取决于LINQ以及你可以使用foreach的事实,但是做到这一点感觉“正确”。
private List _myList; public IEnumerable MyList { get { return _myList; } }
现在我正在编写Java 8代码,我正在讨论是否应该以可能的方式暴露Stream
? 也许是因为我必须调用Collection.stream()
,感觉就像是“正在工作”,但感觉不对?
private Collection myCollection; public Stream getStuff() { return myCollection.stream(); }
Stream
意味着以与IEnumerable
可能相同的方式暴露在接口上?
你问的是错误的问题。 毕竟,支持两者并不困难,例如
Collection getStuff(); default Stream stuff() { return getStuff().stream(); }
所以使用你的接口的代码不需要显式的stream()
调用,而interface
实现者也不需要打扰它。
由于您始终通过Collection.stream()
或显式地公开Stream
支持,因此问题是您是否要公开Collection
。 虽然为Collection
后端提供Stream
很便宜,但从Stream
收集Collection
可能会很昂贵。
因此,暴露两种方式的接口表明它们同样可用,而对于不使用Collection
后端的实现,这些方法中的一种可能比另一种方法更昂贵。
因此,如果您确定所有实现(包括将来的实现)将始终使用(或必须支持) Collection
,那么通过API公开它可能是有用的,因为Collection
支持Stream
不具备的某些操作。 如果您支持通过公开的Collection
修改基础数据,则尤其如此。
否则,仅支持Stream
访问可能是更好的选择。 这使得实现可以自由地拥有除Collection
之外的其他后端。 但是,这也意味着此API不支持Java 8之前的Java版本。
你是否想要自己成为Stream
,主要取决于你是否真的是具有相应权力的Stream
,即支持并行化(并非所有Stream
都可以,但它是Stream
的许多好处之一,它是一个重要的一个)。 通常情况下,我宁愿成为一个Collection
,让自己通过相应的API调用进行Stream
。
从myCollection.stream()
返回Stream
的getStuff()
方法对我来说是正确的。