如何依次执行数量未知的List<Consumer<MyObject>>中的消费者?
批量顺序执行Consumer列表的简洁实现
你提到的for循环写法不仅不够简洁,还存在逻辑问题:调用result.andThen(consumer)后没有将返回的新Consumer赋值回result,最终只会执行第一个Consumer。下面是两种更简洁且正确的实现方式:
方式一:使用Stream.reduce(推荐)
利用Java Stream的reduce操作,可以快速将列表中的Consumer依次组合:
// Java 9+ 可以直接用Consumer.empty()作为默认值 Consumer<MyObject> combined = consumers.stream() .reduce(Consumer::andThen) .orElse(Consumer.empty()); // Java 8 可以用空Lambda作为默认值 // Consumer<MyObject> combined = consumers.stream() // .reduce(Consumer::andThen) // .orElse(obj -> {}); combined.accept(myvalue);
stream().reduce(Consumer::andThen)会遍历列表,将每个Consumer通过andThen串联成一个新的ConsumerorElse用于处理列表为空的情况,避免空指针异常
方式二:简化版for循环
如果不想用Stream,也可以优化原有的for循环,去掉null判断:
Consumer<MyObject> result = obj -> {}; // 初始化为空消费者 for (Consumer<MyObject> consumer : consumers) { result = result.andThen(consumer); } result.accept(myvalue);
这种写法无需判断null,逻辑更简洁,且能正确累积所有Consumer
内容的提问来源于stack exchange,提问作者user15110545
相关产品推荐
相关产品推荐

