java8 stream forEachOrdered 和 forEach 的区别

 

这两个函数都是对集合的流,进行遍历操作,是属于内部迭代;传入一个Consumer的函数接口,下面通过案例,简单了解下:

先看第一段输出和第二段输出,使用的是stream的串行流,也就是程序是串行执行的,所有看到遍历的结果都是按照集合的元素放入的顺序。

看第三段和第四段输出,使用的parallelStream的并行流,也就是在程序内部迭代的时候,会并行处理。

第三段代码的forEachOrdered表示严格按照顺序取数据,第四段forEach在并行中,元素随机排列了。

由此可看出,在并行的程序中,如果对处理之后的数据,没有顺序的要求,使用forEach的效率,肯定是要更好的。

以上就是 java8 stream forEachOrdered 和 forEach 的区别。

 

 

0

Java8 stream list 转 map 方法总结

list转map在Java8中stream的应用

1.利用Collectors.toMap方法进行转换

其中第一个参数就是可以,第二个参数就是value的值。

2.收集对象实体本身

在开发过程中我们也需要有时候对自己的list中的实体按照其中的一个字段进行分组(比如 id ->List),这时候要设置map的value值是实体本身。

account -> account是一个返回本身的lambda表达式,其实还可以使用Function接口中的一个默认方法 Function.identity(),这个方法返回自身对象,更加简洁

重复key的情况

在list转为map时,作为key的值有可能重复,这时候流的处理会抛出个异常:Java.lang.IllegalStateException:Duplicate key。这时候就要在toMap方法中指定当key冲突时key的选择。(这里是选择第二个key覆盖第一个key)

用groupingBy 或者 partitioningBy进行分组

根据一个字段或者属性分组也可以直接用groupingBy方法,很方便。

partitioningBy可以理解为特殊的groupingBy,key值为true和false,当然此时方法中的参数为一个判断语句(用于判断的函数式接口)

 

 

0

java8 stream 多字段条件排序

很多情况下sql不好解决的多表查询,临时表分组,排序,尽量用java8新特性stream进行处理

//返回 对象集合以类属性一升序排序

//返回 对象集合以类属性一降序排序 注意两种写法

//返回 对象集合以类属性一升序 属性二升序

//返回 对象集合以类属性一降序 属性二升序 注意两种写法

//返回 对象集合以类属性一降序 属性二降序 注意两种写法

//返回 对象集合以类属性一升序 属性二降序 注意两种写法

通过以上例子我们可以发现

1. Comparator.comparing(类::属性一).reversed();

2. Comparator.comparing(类::属性一,Comparator.reverseOrder());

两种排序是完全不一样的,一定要区分开来 1 是得到排序结果后再排序,2是直接进行排序,很多人会混淆导致理解出错,2更好理解,建议使用2

实际例子:

现有一个类test 有两个属性:state 状态 time 时间,需要状态顺序且时间倒序

运行结果:

 

 

0