Stream 接口

  Stream filter(Predicate predicate):产生一个新流,其中包含调用流中满足 predicate 指定的谓词元素,即筛选符合条件的元素后重新生成一个新的流。(中间操作)
	
	Stream map(Function mapper),产生一个新流,对调用流中的元素应用 mapper,新 Stream 流中包含这些元素。(中间操作)
	
	IntStream mapToInt(ToIntFunction mapper):对调用流中元素应用 mapper,产生包含这些元素的一个新 IntStream流。(中间操作)
	
	Stream sorted(Comparator comparator):产生一个自然顺序排序或者指定排序条件的新流。(中间操作)
	
	void forEach(Consumer action):遍历了流中的元素。(终端操作)
	
	Optional min(Comparator comparator) 和 Optional max(Comparator comparator):获得流中最大最小值,比较器可以由自己定义。(终端操作)
	
	boolean anyMatch(Predicate<? super T> predicate):判断 Stream 流中是否有任何符合要求的元素,如果有则返回 ture,没有返回 false。(终端操作)
	
	Stream<T> distinct(),去重操作,将 Stream 流中的元素去重后,返回一个新的流。(中间操作)

实战:

  
抽取List对象中的某个属性作为map的key:
Map<Long, MemberField> maps = memberFieldList.stream().collect(Collectors.toMap(MemberField::getPublicId, Function.identity()));

Map<Long, MemberField> maps = memberFieldList.stream().collect(Collectors.toMap(MemberField::getPublicId, m->m));


抽取List对象中的某个属性,形成新的List:
List<Long> longList = memberFieldList.stream().map(MemberField::getPublicId).collect(Collectors.toList());

过滤:
List<Long> parentPublicIdList = memberFieldListTemp.stream().filter(obj->obj.getParentField()==1).map(MemberField::getPublicId).collect(Collectors.toList());


元素去重
List<Integer> list2 =list.stream().distinct().collect(Collectors.toList());

  1、 Stream流不是一种数据结构,不保存数据,它只是在原数据集上定义了一组操作。
   2、这些操作是惰性的,即每当访问到流中的一个元素,才会在此元素上执行这一系列操作。
   3、Stream不保存数据,故每个Stream流只能使用一次。
Stream流可以分成两部分:Intermediate(中间操作)和Terminal(终止操作)。中间操作的返回结果都是Stream,故可以多个中间操作叠加;终止操作用于返回我们最终需要的数据,只能有一个终止操作!!!
一、stream流的Intermediate方法(中间操作)
1、filter(Predicate)
    将结果为false的元素过滤掉,不会改变原来对象的数据,需要显示指定返回值!!!
2、map(fun)
   把对象copy到一个新的对象中,遍历新的对象,对数据进行修改不会改变原来对象的数据,需要显示指定返回值!!!
3、flatMap(fun)
    若元素是流,将流摊平为正常元素,再进行元素转换
4、limit(n)
    保留前n个元素
5、 skip(n)
    跳过前n个元素
6、distinct()
    剔除重复元素
7、sorted(Comparator)
    将流元素按Comparator排序
8、peek(fun)
    流不变,但会把每个元素传入fun执行,可以用作调试
9、forEach()
    遍历当前对象,对数据进行修改时,会改变对象的数据,不需要显示指定返回值!!!(注意和map的区别)
二、stream流的Terminal方法(终结操作)
    约简操作
1、max(Comparator)  
        取最大值
2、min(Comparator)   
        取最小值
3、 count()         
        去和    
4、findFirst()
        返回第一个元素
5、 findAny()
        返回任意元素
6、anyMatch(Predicate)
        任意元素匹配时返回true
7、allMatch(Predicate)
        所有元素匹配时返回true
8、noneMatch(Predicate)
        没有元素匹配时返回true
9、reduce(fun)
        从流中计算某个值,接受一个二元函数作为累积器,从前两个元素开始持续应用它,累积器的中间结果作为第一个参数,流元素作为第二个参数
10、 reduce(a, fun)
        a为幺元值,作为累积器的起点
11、reduce(a, fun1, fun2)
        与二元变形类似,并发操作中,当累积器的第一个参数与第二个参数都为流元素类型时,可以对各个中间结果也应用累积器进行合并,但是当累积器的第一个参数不是流元素类型而是类型T的时候,各个中间结果也为类型T,需要fun2来将各个中间结果进行合并(参考场景一)
三、stream流的收集操作:
1、Collectors.toList()
返回一个List
2、Collectors.toSet()
返回一个集合
3、Collectors.toCollection(集合的构造器引用)
4、Collectors.joining()、Collectors.joining(delimiter)、Collectors.joining(delimiter、prefix、suffix)
字符串元素连接
5、Collectors.summarizingInt/Long/Double(ToInt/Long/DoubleFunction)
产生Int/Long/DoubleSummaryStatistics对象,它有getCount、getSum、getMax、getMin方法,注意在没有元素时,getMax和getMin返回Integer/Long/Double.MAX/MIN_VALUE
6、Collectors.toMap(fun1, fun2)/toConcurrentMap
两个fun用来产生键和值,若值为元素本身,则fun2为Function.identity()
7、Collectors.toMap(fun1, fun2, fun3)/toConcurrentMap
fun3用于解决键冲突,例如(oldValue, newValue) -> oldValue,有冲突时保留原值
8、Collectors.toMap(fun1, fun2, fun3, fun4)/toConcurrentMap
默认返回HashMap或ConcurrentHashMap,fun4可以指定返回的Map类型,为对应的构造器引元
9、Collectors.groupingBy(fun)/groupingByConcurrent(fun)
fun是分类函数,生成Map,键是fun函数结果,值是具有相同fun函数结果元素的列表
10、Collectors.partitioningBy(fun)
键是true/false,当fun是断言函数时用此方法,比groupingBy(fun)更高效
11、Collectors.groupingBy(fun1, fun2)
fun2为下游收集器,可以将列表转换成其他形式,例如toSet()、counting()、summingInt/Long/Double(fun)、maxBy(Comparator)、minBy(Comparator)、mapping(fun1, fun2)(fun1为转换函数,fun2为下游收集器)