概念:Stream是java8提出的一个新的概念,不是输入输出的Stream流,而是一种函数式编程方式在集合类上进行复杂的操作的工具,简言之就是,以内部迭代的方式处理集合数据的操作,内部迭代可以将更多的控制权交给集合类。Stream和Iterator的功能类似,只是Iterator是以外部的形式处理集合数据的操作。
在java8以前对集合操作需要写出处理过程,如在集合处理过程中筛选出满足条件的数据,需要一一遍历出集合每一元素,再逐一判断是否满足条件,满足条件的元素返回。而Stream只需要将作为接口的筛选条件作为参数传递进来,Stream会自行操作并将合适的元素同样以Stream形式返回,最后接收即可。
2种操作:
中间操作:中间操作的结果是刻画、描述一个Stream,并没有产生一个新集合,这种操作也叫惰性求值方法
终止操作:最终从Stream操作得到值
如果返回是Stream是中间操作,返回是其它值或空是终止操作
对粗糙工艺品(Stream数据源),进行颜色加工(最终得到结果),第一步:
筛选合适条件的原型(对应Stream中的Filter),第二步:对筛选出的原料进行上色(对应Stream中的map),第三步:上好色的工艺品取出(Stream的collect(toList()))。
取下工艺品之前的是中间操作,可以有多个或0个中间操作,但每个Stream数据源只有一个终止操作。
1、由Stream生成一个List列表,也可以用Collect(toSet)生成一个Set集合
String[] testStr = {"hello","hello1","hello2","hello3"}
List<String> list = Stream.of(testStr ).colletct(Collections.toList());
2、map中间操作
将一种类型的值映射为另一种类型,可以可以将Stream中的每个值映射为一个新值,最终转换作为一个新的Stream流
将Stream中每个字符串转为大写的形式
String[] testStr= {"hello","hello1","hello2","hello3"}
List <String> list = Stream.of(testStr ).map(test ->test.toUppercase()).collectioin(Collections.toList());
list.forEach(test ->System.out.println(test))
3、filter中间操作
遍历并筛选出满足条件的元素形成一个新的Stream流
筛选出以字母开头的元素个数,此例中的count方法也是终止操作计算Stream元素的个数
String[] testStr= {"hello","hello1","hello2","hello3"}
int count = Stream.of(testStr).filder(test ->test.startsWith("h")).count();
4、flatMap中间操作
可用Stream替换值,并将多个Stream流合成一个Stream流
Integer[] testStr= {1,2,3,4,5}
Integer[] testStr1= {6,7,8,9}
List<Integer> list = (List<Integer>)Stream.of(Arrays.asList(1,2,3,4,5),ArrayList.asList(6,7,8,9)).flatMap(test ->test.stream()).collect(Collections.toList());
5、max 、min终止操作
取出Stream中最长字符串
String[] testStr= {"helo","hello","h2","hel"}
Optional<String>max= Stream.of(testStr).max((p1,p2) -> Integer.compare(p1.length(),p2.length()));
6、reduce终止操作
从Stream中的一组数值生成另一个值
上述的max、min、count实际上都是reduce操作,求出Stream元素的总和
int sum = Stream.of(5,6,7).reduce(0,(accumulator,element)->accumulator+element);