我应该在界面上公开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()返回StreamgetStuff()方法对我来说是正确的。