我应该在界面上暴露Stream <T>吗?

Che*_*tah 4 java java-8 java-stream

如果我正在编写.NET代码,我会经常暴露IEnumerable<T>它可能有意义的地方.也许这取决于LINQ以及你可以使用foreach的事实,但是做到这一点感觉"正确".

private List<String> _myList;

public IEnumerable<String> MyList
{
    get { return _myList; }
}
Run Code Online (Sandbox Code Playgroud)

现在我正在编写Java 8代码,我正在讨论是否应该以Stream<T>同样的方式在可能的情况下公开?也许是因为我必须打电话Collection.stream(),感觉就像是"做工",但感觉不对?

private Collection<String> myCollection;

public Stream<String> getStuff() {
    return myCollection.stream();
}
Run Code Online (Sandbox Code Playgroud)

是否Stream<T>应该以IEnumerable<T>可能的相同方式暴露在接口上?

Hol*_*ger 5

你问的是错误的问题.毕竟,支持两者并不困难,例如

Collection<Foo> getStuff();
default Stream<Foo> stuff() {
    return getStuff().stream();
}
Run Code Online (Sandbox Code Playgroud)

所以使用你的界面的代码不需要显式stream()调用,而实现interface者也不需要打扰它.

因为你总是暴露Stream支持,无论是通过Collection.stream()还是明确,问题是你是否想暴露支持Collection.虽然它很便宜提供StreamCollection后端它可能变成是收集昂贵CollectionStream.

因此,暴露两种方式的接口表明它们同样可用,而对于不使用Collection后端的实现,这些方法中的一种可能比另一种方法更昂贵.

因此,如果您确定所有实现(包括将来的实现)将始终使用(或必须支持)Collection,那么通过API公开它可能是有用的,因为它Collection支持某些Stream不支持的操作.如果您支持通过公开的方式修改基础数据,则尤其如此Collection.

否则,Stream仅支持访问可能是更好的选择.这使得实现可以自由地拥有其他后端而不是Collection.但是,这也意味着此API不支持Java 8之前的Java版本.