java8特性stream流的使⽤总结
stream的使⽤ ,让我们的代码更加简洁,易懂(易维护)。它的使⽤,减少了⼤量的if条件语句和for循环语句,从输⼊到输出,像⼀条河流⼀样,让维护者读起来更像是读⼀篇⽂章。
⼀个Stream流主要由三部分组成,即数据源、中间操作、终⽌操作。
1、数据源
常⽤的创建流⽅式
a、Stream.of,我们可以通过Stream的静态⽅法,传⼊⼀个泛型数组,或者多个参数,创建⼀个流。
b、Arrays.stream,我们可以通过Arrays的静态⽅法,传⼊⼀个泛型数组,创建⼀个流。
c、Collection.stream,可以⽤过集合的接⼝的默认⽅法,创建⼀个流;使⽤这个⽅法,包括继承Collection的接⼝,如:Set,List,Map 等等。
2、中间操作
常⽤的中间操作,以list.stream()数据源为例
a、filter,过滤流中符合条件的元素。经过list.stream().filter(item->item>0)的操作 ,流中只剩下⼤于0的item元素。
b、map,元素类型转化。Integer集合list,经过list.stream().map(item-&String())的操作 ,流中每个元素转化为了String类型。
c、distinct,流中元素去重。经过list.stream().distinct()操作,流中重复的元素被⼲掉。特别说明,distinct去重依据的
是hashCode和equals⽅法,如果元素是对象,若要求按照对象的某属性去重需要重写 hashCode和equals⽅法。
d、sort,流中元素排序。经过list.stream().sort()操作,流中元素被按照⾃然排序。Student对象组成的list,若要求按照学⽣的年龄逆序,
即list.stream().sorted(Comparatorparing(Student::getAge).reversed()),使⽤sort排序的每个元素必须实现Comparable 接⼝。
e、flatMap,流的扁平化,即降维合并处理。⼀个List<List<String>>流list,经过list.stream().flatMap(item->item.stream())的处理,变
为List<String>流。
3、终⽌操作
常⽤的终⽌操作,以list.stream().filter(item->item!=null)中间操作为例
a、forEach,内部迭代。
b、allMatch, anyMatch,noneMatch 匹配,返回Boolean类型,allMatch—检查是否匹配所有元素,anyMatch—检查是否匹配任意元素,noneMatch—检查是否没有匹配所有元素。list.stream().filter(item->item!=null).allMatch(item->item>0)若流中元素全部⼤于0的返回true,否则返回false。
c、findFirst和findAny 查,返回Optional<T>类型。list.stream().filter(item->item!=null).findFirst()得到T的Optional,若不为null,使⽤get()⽅法获取T;或者orElse(null)获取。
d、max、min和count,count()返回元素数量 ,max()和min()接收⼀个Comparator接⼝参数,返回最⼤和最⼩的Optional<T>。Stream.of(1, 2,3,4,5).max(Integer::compareTo)获取元素最⼤的Optional<Integer>,再使⽤get()可以得到5。
补充:当max有多条记录时,取流的第1条。max⽤了BinaryOperator的maxBy⽅法。具体参照源码:
public static<T> BinaryOperator<T>maxBy(Comparator<?super T> comparator){
return(a, b)-> comparatorpare(a, b)>=0? a : b;
}
e、reduce 归约
接收⼀个参数:Stream.of(1,2,3,4,5).reduce((a,b)->a+b),结果类型为Optional<Integer>,调⽤get()⽅法得到15。
接收两个参数:Stream.of(1, 2, 3, 4, 5).reduce(5, (a, b) -> a + b),结果类型为Integer,值为20,第⼀个参数为初始值 。
接收三个参数:Stream.of(1, 2, 3, 4, 5).parallel().reduce(0, (a, b) -> a + b, (s1, s2) -> s1 + s2),第三个参数只有在并⾏流中才会执⾏ ,作⽤是将并⾏每个流的运算结果按照第三个参数的运算规则进⾏最终合并。
f、collect 收集,该⽅法功能⽐较强⼤,能将流收集成很多形式。collect⽅法接收的多个参数中最主要有⼀个Collector接⼝。
收集为List:list.stream().filter(item->item!=null).List())
收集为Set:list.stream().filter(item->item!=null).Set())
收集为HashSet:list.stream().filter(item->item!=null).Collection(HashSet::new))
收集为Map,接收两个参数:list.stream().filter(item->item!=null).Map(item1-&Key(),item2->item2)),第⼀个参数设置map的key,第⼆个参数设置map的value,此时应注意key值必须唯⼀,否则会抛异常。key唯⼀下⾯Guava写法效果相
同:Maps.uniqueIndex(list, item-&Key()),得到的结果都是Map<String,T>类型。
接收三个参数:list.stream().filter(item->item!=null).Map(item1-&Key(),item2->item2,(val1,val2)->val2)),前两个参数同上,第三个参数为map的value合并函数。上⾯表达式表⽰当出现相同的key时,value取后者。
接收四个参数:list.stream().filter(item->item!=null).Map(item1-&Key(),item2->item2,(val1,val2)-
>val2,LinkedHashMap::new)),前三个参数同上,第四个参数表⽰设置接收map的容器为LinkedHashMap。该参数不设置的情况下默认
为HashMap。
java stream
多级分组groupingBy:接收⼀个参数:list.stream().filter(item->item!=null).upingBy(item1-&Key())),按照key分组,得到Map<String,List<T>>类型结果。
接收两个参数:list.stream().filter(item->item!=null).upingBy(item-&Key(),Collectors.mapping(item->new
Key(),item),List())))
第⼆个参数重新定义了map的value收集类型,得到Map<String,List<U>>类型结果。
上⾯Map<String,List<U>>结果也可以使⽤toMap实现:list.stream().filter(item->item!=null).Map(item-&Key(),item -> Stream.of(new Key(), item)).List()),(a, b) -> at(a.stream(), b.stream()).List())))
//待补充…

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。