Java 如何以函数式方式实现先收集Stream元素再传给Consumer的一行式写法
Java Stream 实现流元素收集后整体传入Consumer的一行式操作方案
核心需求
希望存在函数式实现方式,能够先将Stream的元素全部收集完成,再立即把得到的集合传递给Consumer处理,也就是等待流执行结束后,以集合为单位对所有流元素执行终端操作,而非逐个处理。
需要实现等价于以下代码的一行式写法:
Stream<Event> stream = // 事件流 List<Event> list = stream.collect(Collectors.toList()); doProcessEvents(list);
已尝试的实现路径
目前尝试借助JDK 14官方文档说明的Collectors.collectingAndThen()方法搭配Function实现想要的效果,示例代码如下:
Function<List<Event>, Void> processingFunction = (list -> { doProcessEvents(list); return null; }); Stream<Event> stream = // 事件流 stream.collect(Collectors.collectingAndThen(Collectors.toList(), processingFunction);
此前考虑过的暂不可行替代方案
- 方案一:期待
collectingAndThen()提供第二个参数为Consumer的重载版本,例如Collectors.collectingAndThen(Collector downstream, Consumer consumer),但标准JDK库中目前不存在这类重载。 - 方案二:期待Consumer接口自带
finish()方法,可在流的最后一个元素被消费后自动执行,对应的自定义实现示例如下:
class EventConsumer implements Consumer<Event> { private final List<Event> list = new LinkedList<>(); @Override public void accept(Event ev) { events.add(ev); } public void finish() { doProcessEvents(events); } } // 使用示例 Stream<Event> stream = // 事件流 stream.forEach(new EventConsumer());
该方案的问题是:事件会被存入内部列表,但自定义的finish()方法不会被流自动调用;稍作修改虽可正常运行,但仍无法实现一行式写法:
Stream<Event> stream = // 事件流 EventConsumer consumer = new EventConsumer() stream.forEach(consumer); consumer.finish();
内容的提问来源于stack exchange,提问作者matsev
相关产品推荐
相关产品推荐

