Stream:并不是以前IO中的Stream流,在java8中的package java.util.stream包中;java 8的函数式编程重点在于Lambda和Stream一起使用方能发挥最大威力,代码简介(可以不写for循环),多核友好(并行程序只需要调用parallel()方法即可),Stream并不是一种数据结构,他只是数据源的一中视图,数据源可以是一个数组,容器,IO流等等,可以说Stream是为java的函数式编程而生。
1:Stream整体架构
2:常见的Stream接口继承关系如图
图中4种Stream接口均继承BaseStream接口,对应三种基本类型(int,long,double),但他不是一个包装类型,这样不仅提高了性能还增加了特定的接口函数
Stream特点
无存储:Stream不是一种数据结构,只是某种数据源的视图
为函数式编程而生:对Stream的如何操作都不会修改其数据源,比如对其过滤操作后并不会将其删除过滤的元素,而是产生一个个满足过滤需求的Stream
惰性执行:Stream并不是立即执行,而是在用户需要Stream的操作结果的时候才会执行
可消费性:只能被操作一次,比如遍历过后便会生效
对Stream的操作可分为两类
其一:中间操作总是会惰性执行:调用中间操作只会生成一个标记了该操作的心Stream,仅此而已
其二:结束操作会触发实际计算:计算发生时会把所有的中间操作积攒的操作以pipeline的方式执行,这样可以减少迭代次数,计算之后Stream就会失效
Stream接口常见的方法
Stream常见接口分类
中间操作 | concat(),distinct(),filter(),flatMap(),limit(),map(),peek(),skip(),sorted(),parallel(),sequential(),unordered().... |
结束操作 | allMatch(),anyMatch(),collect(),count(),findAny(),findFirst(),forEach(),forEachOrdered(),max(),min(),reduce()..... |
forEach()方法:查看源码可知方法签名为
void forEach(Consumer<? super T> action);
由于forEach是结束方法,下面代码会立即执行,输出所有结果
Stream<String> stringStream=Stream.of("I","Love","Coding","U");
stringStream.forEach(s -> System.out.println(s));
filter()方法:查看源码可知方法签名为:
Stream<T> filter(Predicate<? super T> predicate);
返回一个满足条件的Stream
stringStream.filter(s -> s.length()==1).forEach(s -> System.out.println(s));
distinct()方法:返回一个去处重复元素的Stream
sort()方法:排序(字符串默认由长到短),可自行定义
stringStream.sorted((str1, str2) -> str1.length()-str2.length())
.forEach(str -> System.out.println(str));
map():转换后Stream个数不变,类型取决于转换后的类型,
其余方法不再一一赘述