Stream是Java8中用于处理集合的API,利用函数式编程的思想方便的处理Java的集合类.
创建Stream
Java8在Collection接口中新添加了stream方法,意味着所有的集合类都可以通过调用stream方法来创建stream.
如果要对数组生成stream,可以通过静态的Stream.of()方法将它转换为一个Stream.
同样Stream.of()可以接受任意个参数,比如Stream.of("xiaoming","hehe");
Stream.empty()可以创建不含有任何元素的Stream
Stream.generate()方法可以创建无限Stream,比如Stream.generate(Math::random)创建随机数字无限Stream.Stream.generate()方法接受的是一个无参的函数,同样的Stream.iterate()方法有两个参数,第一个参数是一个seed,第二个参数是一个函数,通过无限的对种子使用该函数产生无限的Stream.
许多其它类也提供了可以创建Stream的方法,比如Patterm类有splitAsStream的方法,Files.lines也可以返回一个Stream.
流转换API
流转换指的是在一个流中读取数据,并将转换后的数据写入到另一个流中
stream.filter():过滤器转换,接受一个Predicate对象,可以直接传入lambda表达式
stream.map():对每一个元素应用一个函数
stream.limit(n)函数返回包括n个元素的新流
stream.skip(n)函数丢弃掉前面的n个元素
Stream.concat()函数将两个新流连接到一起
stream.distinct()函数返回具有与原来流具有相同顺序但是没有重复元素的新流
stream.sorted()函数接受一个Compator对象用于排序
聚合操作
聚合操作通过函数从流中获取数据,注意聚合操作都是终止操作,当一个流使用了终止操作后他就不能再使用其他的操作了.
stream.max() 返回最大值
stream.min() 返回最小值
stream.findFirst()返回第一个值,stream.findAny()返回任意值,stream.anyMatch()返回是否有匹配值
stream.reduce():接受一个二元函数,并且将这个二元函数从前两个元素开始重复利用到流的其他元素上,返回一个Optional.如果第一个参数传入一个基准值,那么返回值就永远不会为空,就不需要使用Optional,这时候返回值是实际的类型.
收集结果
stream.iterator()返回传统风格的迭代器
stream.toArray()返回数组,参数为数组的构造函数,比如stream.toArray(Integer[]::new)
stream.forEach()
stream.collect()
通过给collect()传递参数可以实现很多形式的结果收集.Collectors工具类提供了很多这样的参数.
下面默认静态导入了Collectors中的所有的方法.
stream.collect(toList())
stream.collect(toSet))
stream.collect(toCollection(TreeSet::new))
上面三个函数可以实现将流收集为list或set
stream.collect(joining()):将所有字符串拼接,给joining()传入参数可以添加分隔符
stream.collect(summarizingInt(fun)),fun是一个将流元素应设为数字的函数,通过collect的返回值可以得到结果的总和,最大值,最小值,平均值等,summarizingInt中的Int可以用Long|Double代替.
stream.collect(toMap(key,value,fun,con))将结果收集到Map中,key和value是两个函数参数,用于得到相应元素的键和值,第三个参数fun用于处理key相同情况,第四个参数传入相应Map的构造函数.
stream.collect(groupingBy(fun,toList())),根据fun对流进行分组,返回一个map,map的值类型可以通过第二个参数指定(toLIst,toSet).如果分类函数是一个predicate函数可以将groupingBy函数替换为partitioningBy
groupingBy的第二个参数
groupingBy的第二个参数可以传入其他一些收集器进行downstream处理:couning(),summing(),maxBy(),minBy().
mapping(fun,fun2)方法将一个函数应用到downstream结果上,其中的fun2()为另一种downstream方法,
summarizingInt()方法
reducing()方法对每个组中的元素进行reduce操作
joing()