java 返回集合,Java 我应该返回集合还是流?

小编典典

答案是一如既往的“取决于”。这取决于返回的集合的大小。这取决于结果是否随时间变化,以及返回结果的一致性有多重要。这在很大程度上取决于用户使用答案的方式。

首先,请注意,你始终可以从Stream中获取Collection,反之亦然:

// If API returns Collection, convert with stream()

getFoo().stream()...

// If API returns Stream, use collect()

Collection c = getFooStream().collect(toList());

所以问题是,这对你的呼叫者更有用。

如果结果可能是无限的,则只有一种选择:流。

如果结果可能非常大,则你可能更喜欢Stream,因为一次实现所有可能没有任何价值,这样做可能会产生巨大的堆压力。

如果调用者要做的只是遍历它(搜索,过滤器,聚合),则你应该更喜欢Stream,因为Stream已经内置了这些内容,因此不需要实现集合(特别是如果用户可能不处理集合的话)。整个结果。)这是一个非常普遍的情况。

即使你知道用户将对其进行多次迭代或以其他方式保留它,你仍然可能想返回一个Stream,原因很简单,无论你选择放入哪个Collection(例如ArrayList)都可能不是他们想要的形式,然后调用者无论如何都要复制它。如果你返回流,则他们可以collect(toCollection(factory))按照所需的形式进行获取。

上面的“首选Stream”案例主要是因为Stream更加灵活。你可以后期绑定到你的使用方式,而不会产生将其具体化为Collection的成本和约束。

当有很强的一致性要求时,必须返回集合的一种情况是,必须为移动目标生成一致的快照。然后,你需要将元素放入不会更改的集合中。

因此,我想说,在大多数情况下,Stream是正确的答案-它更灵活,不会带来通常不必要的实现成本,并且可以根据需要轻松地转换为你选择的Collection。但是有时候,你可能必须返回Collection(例如,由于强烈的一致性要求),或者你可能想返回Collection,因为你知道用户将如何使用它,并且这对他们来说是最方便的事情。

2020-03-18

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值