关于stream:还在stream中使用peek不要被这些陷阱绊住了
简介自从JDK中引入了stream之后,好像所有都变得很简略,依据stream提供的各种办法,如map,peek,flatmap等等,让咱们的编程变得更美妙。 事实上,我也常常在我的项目中看到有些小伙伴会常常应用peek来进行一些业务逻辑解决。 那么既然JDK文档中说peek办法次要是在调试的状况下应用,那么peek肯定存在着某些鲜为人知的毛病。一起来看看吧。 peek的定义和根本应用先来看看peek的定义: Stream<T> peek(Consumer<? super T> action);peek办法承受一个Consumer参数,返回一个Stream后果。 而Consumer是一个FunctionalInterface,它须要实现的办法是上面这个: void accept(T t);accept对传入的参数T进行解决,然而并不返回任何后果。 咱们先来看下peek的根本应用: public static void peekOne(){ Stream.of(1, 2, 3) .peek(e -> log.info(String.valueOf(e))) .toList(); }运行下面的代码,咱们能够失去: [main] INFO com.flydean.Main - 1[main] INFO com.flydean.Main - 2[main] INFO com.flydean.Main - 3逻辑很简略,就是打印出Stream中的元素而已。 peek的流式解决peek作为stream的一个办法,当然是流式解决的。接下来咱们用一个具体的例子来阐明流式解决具体是如何操作的。 public static void peekForEach(){ Stream.of(1, 2, 3) .peek(e -> log.info(String.valueOf(e))) .forEach(e->log.info("forEach"+e)); }这一次咱们把toList办法替换成了forEach,通过具体的打印日志来看看到底产生了什么。 [main] INFO com.flydean.Main - 1[main] INFO com.flydean.Main - forEach1[main] INFO com.flydean.Main - 2[main] INFO com.flydean.Main - forEach2[main] INFO com.flydean.Main - 3[main] INFO com.flydean.Main - forEach3通过日志,咱们能够看出,流式解决的流程是对应流中的每一个元素,别离经验了peek和forEach操作。而不是先把所有的元素都peek过后再进行forEach。 ...