Stream.collect三参数方法与Collector.of的区别及自定义Collector实现校验
问题1解答
不存在通用的内置Collector可以适配任意的supplier/accumulator/combiner组合,来等价替换三参数Stream.collect调用。Java标准库没有提供专门的内置工具,直接把三参数collect里BiConsumer类型的合并器自动封装为Collector要求的BinaryOperator类型合并器,只有特定场景的固定Collector(比如Collectors.toList())能对应某一种固定参数的三参数collect调用,不具备通用性。
问题2解答
这个写法完全正确。
根据Stream.collect的官方文档约定,三参数版本的合并器逻辑就是把第二个结果容器的内容合并到第一个容器中,你写的lambda正好符合这个约定:先调用传入的合并器把r2合并到r1,再直接返回r1作为合并后的结果,和Collector要求的合并器返回值规则完全匹配,执行效果和原生三参数collect没有任何差异。
问题3解答
功能上确实可以实现相同的效果,但效率低很多。
这种写法每次合并两个容器的时候,都会额外创建一个新的结果容器,再把两个旧容器的内容全部拷贝到新容器里,相比问题2里直接复用第一个容器的写法,多了新对象创建、全量内容拷贝的开销,数据量越大性能差距越明显。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

