在 Java 8 中我越来越多地替换Collection
返回值与Stream
.
所以我曾经拥有过:
public List<Element> getElementList() {
return elements;
}
我现在正在使用:
public Stream<Element> streamElements() {
return elements.stream();
}
我对此的论点是:
- 它强制底层列表的不变性
- 它掩盖了这样一个事实:is一个基础列表。稍后可以将其更改为集合或某种其他结构,而无需更改方法签名。
- 它很好地封装了该方法的用户应该对项目执行某些操作,而不是对列表执行某些操作。
- 如果需要的话,稍后可以对其进行简单的并行化。
事实上现在,在我的代码中,返回一个List
或某些其他集合明确地认识到用户可能认为该集合是可变的并且期望能够更改它。
显然,其中一些可以通过不可变集合来实现。
我的问题是:有人能看出这种设计有什么缺点吗?与返回集合相比,不可变集合有什么优势吗?Stream
?
我并不是说你不应该返回 Stream,更不是说你不应该返回 Stream,但这样做也有很多缺点:
- 它不会告诉 API 用户集合是否已排序 (List) 或未排序 (Set),或已排序 (SortedSet)
- 它不会告诉 API 的用户集合是否可以包含重复项(List)或不包含重复项(Set)
- 它不允许用户轻松快速地访问列表的第一个或最后一个元素,甚至不知道它的大小。
- 如果 API 的用户需要多次遍历集合,他就被迫将每个元素复制到新集合中。
我想说的是,选择返回流而不是集合还取决于您已经拥有的内容。如果集合已经具体化(考虑一个具有 OneToMany 已经具体化为 Set 的 JPA 实体),我可能会在集合上返回一个不可变的包装器。另一方面,如果要返回的集合是另一个集合的计算或转换的结果,则返回 Stream 可能是更好的选择。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)