void forEach(Consumer<? super T> action)
void forEachOrdered(Consumer<? super T> action)
这两个方法功能类似,使用方法一致,区别就在于并行处理的时候forEachOrdered是严格按照流中元素顺序执行,而forEach是无序的因此效率高一点。
这里就那forEach为例进行说明;
forEach方法作用就是遍历流中元素对元素执行参数函数,这个方法对于集合中是java基本数据类型的数据来说是没什么作用,为什么呢就是因为其没有返回数据,又不能修改流和集合中的元素(无论什么数据类型Stream中的元素都不可修改),比如我们定义个参数函数对流中每个元素进行处理,但是处理完不会把处理之后的数据放到新的流中返回给我们使用,而之前流因为使用过已经关闭不能再使用。这个方法使用最多的就是打印输出流中的元素,上面很多例子用到这种方法。
List<List<String>> list = List.of(List.of("a","b","c","d"), List.of("1","2","3","4"), List.of("one","two","three"));
list.stream().forEach(onelist -> onelist.stream().forEach(System.out::print));
对于非基础数据类型的数据集合来说这个方法还是挺好用的,看下面例子:
List<User> users = List.of(new User("111@qq.com","beijing"), new User("222@qq.com","shanghai"), new User("333@qq.com","tianjin"));
users.forEach(a -> System.out.println(a.getAddr()));
users.stream().forEach(a -> a.setAddr("china - "+a.getAddr()));
users.forEach(a -> System.out.println(a.getAddr()));
运行结果:
beijing
shanghai
tianjin
china - beijing
china - shanghai
china – Tianjin
我们通过forEach方法批量修改User对象数组中user的地址,给每个地址前面加上china前缀。