答案是,一如既往,“视情况而定”。这取决于返回的集合的大小。这取决于结果是否随时间而变化,以及返回结果的一致性有多重要。这在很大程度上取决于用户可能如何使用答案。
首先,请注意,您始终可以从 a 获取 a,反之亦然:Collection
Stream
// If API returns Collection, convert with stream()
getFoo().stream()...
// If API returns Stream, use collect()
Collection<T> c = getFooStream().collect(toList());
所以问题是,哪个对你的来电者更有用。
如果您的结果可能是无限的,则只有一个选择:.Stream
如果您的结果可能非常大,您可能更喜欢 ,因为一次实现所有结果可能没有任何价值,这样做可能会产生巨大的堆压力。Stream
如果调用方要做的就是循环访问它(搜索,过滤器,聚合),您应该更喜欢,因为这些已经内置了,并且不需要具体化集合(特别是如果用户可能不处理整个结果)。这是一个非常常见的情况。Stream
Stream
即使您知道用户将多次迭代它或以其他方式保留它,您仍然可能希望返回一个,因为一个简单的事实是,无论您选择将其放入什么(例如,)可能不是他们想要的形式,然后调用方无论如何都必须复制它。如果你返回 一个 ,他们可以做,并以他们想要的形式得到它。Stream
Collection
ArrayList
Stream
collect(toCollection(factory))
上述“首选”案例大多源于更灵活的事实;您可以延迟绑定到使用它的方式,而不会产生将其具体化为.Stream
Stream
Collection
必须返回 a 的一种情况是,当存在强一致性要求时,您必须生成移动目标的一致快照。然后,您需要将元素放入不会更改的集合中。Collection
所以我想说的是,大多数时候,是正确的答案 - 它更灵活,它不会施加通常不必要的物化成本,并且可以在需要时轻松转换为您选择的集合。但有时,您可能必须返回(例如,由于强一致性要求),或者您可能希望返回,因为您知道用户将如何使用它,并且知道这对他们来说是最方便的事情。Stream
Collection
Collection
如果您已经有一个合适的“躺着”,并且您的用户似乎更愿意将其作为与它进行交互,那么返回您拥有的东西是一个合理的选择(尽管不是唯一的选择,而且更脆弱)。Collection
Collection