在开发与任何旧代码无关的API时,我经常发现自己编写的方法纯粹是通过收集结果终止的Streams管道。像这个:
ImmutableSet<T> deriveSomethingMeaningfulFromPrivateState() {
return myPrivateThingies.stream()
.map(this::ownerOfThing)
.map(Owner::socialStatus)
.filter(SocialStatus::isHeAFineMatey)
.collect(MyCustomCollectors.toImmutableSet());
}
现在,此类的大多数客户端通常将需要Collection(在本例中为ImmutableSet)来搜索元素并对其进行迭代,但是某些客户端可能会受益于拥有Stream,因此可以在此基础上传递更多的操作流,而无需从集合中获取新的流。因此,返回Stream会给客户提供他们如果拥有Collection便拥有的选项超集(毕竟,他们总是可以collect()
自己拥有Stream:
Stream<T> deriveSomethingMeaningfulFromPrivateState() {
return myPrivateThingies.stream()
.map(this::ownerOfthing)
.map(Owner::socialStatus)
.filter(SocialStatus::isHeAFineMatey);
// No collect
}
这种方法对我来说很诱人,因为我看不到它可能存在的任何潜在缺陷。但是,我在任何库中都从未见过这种方法(可能是因为Java 8出现后没有发布太多的库),所以我有点害怕采用它。现有的库类通常在从私有状态派生出某些东西时返回Collections。
如果我决定在Java-8之前的我自己会返回Collection的任何地方返回Stream ,会发生什么不好的事情?还是我可能在这里做一些反模式的事情,而这一切都源于私人国家?