返回流而不是列表

spr*_*ter 8 java java-8 java-stream

在Java 8中,我越来越多地用Collection返回值替换Stream.

那么我曾经拥有过的地方:

public List<Element> getElementList() {
    return elements;
}
Run Code Online (Sandbox Code Playgroud)

我现在正在使用:

public Stream<Element> streamElements() {
    return elements.stream();
}
Run Code Online (Sandbox Code Playgroud)

我的论点是:

  1. 它强制执行基础列表的不变性
  2. 它隐藏的事实,有一个基础列表.稍后可以在不更改方法签名的情况下将其更改为集或其他结构.
  3. 它很好地封装了该方法的用户期望对项目做某事而不是列表.
  4. 如果需要,可以稍后平行化.

事实上,现在,在我的代码中,返回一个List或一些其他集合明确地认识到用户可能认为该集合是可变的并且期望能够改变它.

显然,使用不可变集合可以实现其中一些.

我的问题是:任何人都可以看到这种设计的任何缺点吗?返回一个不可变集合有什么优势Stream吗?

JB *_*zet 10

我不是说你不应该返回Stream,更不要说你不应该返回Stream,但是这样做也有很多缺点:

  • 如果集合是按顺序排序(List)还是不是(Set),或者排序(SortedSet),它不告诉用户API
  • 如果集合可以包含重复项(List)或者不包含重复项(Set),它不会告诉用户API
  • 它不允许用户轻松快速地访问列表的第一个或最后一个元素,甚至不知道它具有哪个大小.
  • 如果API的用户需要对集合进行多次传递,则他被迫将每个元素复制到新集合中.

我会说选择返回流而不是集合也取决于你已经拥有的东西.如果集合已经实现(考虑一个已经实现为OneToMany的JPA实体),我可能会在集合上返回一个不可变的包装器.另一方面,如果要返回的集合是计算或转换另一个集合的结果,则返回Stream可能是更好的选择.