Stream:并不是以前IO中的Stream流,在java8中的package java.util.stream包中;java 8的函数式编程重点在于Lambda和Stream一起使用方能发挥最大威力,代码简介(可以不写for循环),多核友好(并行程序只需要调用parallel()方法即可),Stream并不是一种数据结构,他只是数据源的一中视图,数据源可以是一个数组,容器,IO流等等,可以说Stream是为java的函数式编程而生。

1:Stream整体架构

java数据源配置 goldende java stream数据源_java

2:常见的Stream接口继承关系如图

java数据源配置 goldende java stream数据源_Java 8_02

图中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个数不变,类型取决于转换后的类型,

其余方法不再一一赘述