上周,我描述了自定义流收集器的用例。 我收到了关于Twitter的有趣评论: 有趣的文章。 完成' 阐明了使用标准的T铅收集器解决了这个具体问题 - Miguel Martins(@Miguucm)5月3日,2021年5月3日 戴着帽子,米格尔! 你的评论揭示了一种我不知道的方法! 返回一个收集器,该收集器是两个下游收集器的复合。 传递给生成的收集器的每个元素都是由下游收集器处理的,然后将它们的结果使用指定的合并函数合并到最终结果中。 供应商:创建一个结果容器,其中包含通过调用每个收集器供应商获得的结果容器 累加器:使用其结果容器和输入元素调用每个收集器的累加器
Finisher:调用每个收集器的Finisher与其结果容器,然后调用提供的合并并返回其结果。
我们确实可以用两个简单的收集器实现,一个聚集的价格行和其他汇总购物车的价格。
公共Priceandrows getPriceAndrows(购物车){返回购物车。 getProducts()。 entryset()。溪流 () 。地图(卡车:新闻)(1)。收集(收集者。Teeing((2)收藏家。减少(大型,Carrrow :: getrowPrice::添加),(3)收藏家。Tolist(),(4)PriceanDrows::新(5))); }
最后,最后一个参数创建一个新对象,该对象聚合来自第一和第二收集器的结果
提取Collector,I.,Supplier(),`累加器(),Combiner()和Finisher()的每个组件
我希望这篇文章在创建自定义收集器之前使用Teeing()考虑。再来米格尔!
顺便说一下,我总是很乐意学习新事物。如果您有见解分享,您可以使用以下评论系统或Twitter。
可以在Maven格式的Github上找到此帖子的完整源代码。