Stream是java8中处理集合(数组)的关键抽象概念,可以对集合进行查找、过滤、映射、规约等操作。使用Stream API对集合(数组)进行操作,类似于使用sql进行数据库查询。Stream是有关于集合计算的,Collection是有关于集合储存的。Stream的操作分为三个步骤,1.创建Stream;2.中间操作:对数据源进行处理但不执行;3.终止操作:一旦执行终止操作就会执行中间操作链,并产生结果。之后不会再被使用,如果还是操作这个集合或数组,可以重新创建Stream。
注意事项:
- Stream自己不会存储数据。
- Stream不会改变源对象,会返回一个持有结果的新Stream。
- Stream操作是延迟执行的,只有遇到终止操作才会执行。
1.创建Stream
- Collection.stream():通过集合创建Stream:方法位于Collection接口中(默认方法),分别为stream、parallelStream方法,其中的stream返回一个顺序流,parallelStream返回一个并行流。
//顺序流
List<String> stringList = Arrays.asList("张三","李四","王五","赵六");
stringList.stream().forEach(System.out::println);
- Arrays.stream(T t):通过Arrays的静态方法steam获取数组流:Arrays中包括处理基础类型的steam方法,如int类型数组返回IntStream。对于引用类型的对象数组返回Stream。
//基础类型
int[] num = new int[]{
1,2,36,5};
IntStream intStream = Arrays.stream(num);
intStream.forEach(System.out::println);
//引用类型
Major[] majors = new Major[]{
new Major("张三",1),new Major("李四",2)};
Stream<Major> majorStream = Arrays.stream(majors);
majorStream.forEach(System.out::println);
- Stream.of:通过Stream的静态方法Stream<T> of(T… values)方法。
//Stream静态方法of创建Stream,of为可变参数,相当于数组,可以放入多个同类型
Stream<Double> doubleStream = Stream.of(1.2,3.1,5.2,100.0);
doubleStream.forEach(System.out::println);
- 创建无限流:
1.Stream.iterate
//迭代
//public static<T> Stream<T> iterate(final T seed, final UnaryOperator<T> f)
//以2为初始值,计算平方,得到的值再计算平方,依次进行(1=<n<=5):
//定义一个初始值seed为2,定义函数为t*t,即第一次为2,第二次为2*2=4,第三次为4*4=16,
//第四次为16*16=256,第五次为256*256=65536,依次运算。
//即用第n-1个数作为变量带入关于t的函数后进行计算,得到的结果再次作为初始值调用t的函数。
Stream.iterate(2,t->t*t).limit(5).forEach(System.out::println);
2.Stream.generate
//生成
//public static<T> Stream<T> generate(Supplier<? extends T> s)
//生成10个随机数并打印
Stream<Double> doubleStream1 = Stream.generate(Math::random).limit(10);
doubleStream1.forEach(System.out::println);
2.中间操作
多个中间操作可以连接形成一个流水线,除非触发终止操作否则不会执行,触发终止操作后一次性全部处理,成为惰性求值,在处理完后这个Stream不能再使用。
Sex类:
public enum Sex {
MEN("男"),
WOMEN("女");