1、背景:Stream 是 Java8 的新特性,它允许你以声明式的方式处理数据集合,可以把 它看作是遍历数据集的高级迭代器。此外与 stream 与 lambada 表达示结合后 编码效率与大大提高,并且可读性更强。
2、Stream流是什么?
从支持的数据源(数组和集合)处获得元素序列,放入Stream流中。即就是将数据源的元素拿出来单独存放在其他地方进行操作,并不对数据源本身进行操作。
(Stream中提供了一系列遍历操作)
3、如何获取流?
有三种方法可以获取流,如下所示:
(1)通过集合来获取流
ArrayList<String> arrayList=new ArrayList<>();
Stream<String> stringStream=arrayList.stream();//从集合来获取流
利用的是集合中的Stream方法来获取。
(2)通过数组来获取流
Integer []a={1,2,3,4,5};
Stream<Integer> integerStream= Arrays.stream(a);//从数组来获取流
这个方法是Arrays类中的一个静态方法,将数组当做参数传入即可获得这个数组的流。
(3)通过Stream中的静态方法来获取流
Stream<Integer> x=Stream.of(1,2,3,4,5,6);//利用方法来获取流
这个方法中的参数是一个可变长度参数,传入的参数将作为数据源数据存入流。
在这里简单介绍一下什么是可变长度参数:写法: void test(int ... c) {}其底层实质是数组。并且一个参数列表中只能有一个可变长度参数,并且只能放在最后一个位置。
4、对流的操作?
使用流过程:获取流->中间操作(返回的还是一个流)->终端操作(返回的是集合或数组)。
注意:中间操作可以有多个,终端操作只有一个。
常用的中间操作举例:
Stream<Integer> stream=Stream.of(1,4,6,3,2,1,5);
stream.sorted((o1,o2)->{return o1-o2;}) //排序操作,需要结合Lambda表达式
.distinct()//去重复操作
.skip(2)//跳过指定数目的元素
.limit(2)//只保留前指定数目的元素
.filter((e)->{return e>3;})//筛选出指定条件的元素
.map(Integer::intvalue)//此方法参数是一个方法,方法返回的是元素
.forEach((e)->{ System.out.println(e); });//终端操作遍历
值得注意的是:将Stream与Lambda表达式结合后,可以使程序更加简洁方便。
常用的终端操作举例:
.toArray();//将流转换为数组,返回的是一个变换后的数组
.max((o1,o2)->{return o1-o2;})
.get(); //返回的是流中最大的元素,同理mix方法拿到最小的元素。
.count(); //返回一个long类型,指的是流中元素个数。
.reduce((a,b)->{return a+b;})
.get(); //最终返回Integer类型,指的是流中元素之和。
.anyMatch(e->{return e>3;})
//返回一个boolean值,判断流中是否有元素满足条件
.allMatch(e->{return e>3;})
//返回一个boolean值,判断流中全部元素是否满足条件
.collect(Collectors.toList());//将流转换为一个List集合
.collect(Collectors.toSet());//将流转换为一个Set集合
.collect(Collectors.toMap(Apple::getCol,Apple::getValue));//将流转换为Map集合
//转为Map这个方法参数也是方法,且一个返回值当做键,一个返回值当做值
总之:流的使用为让我们对集合或数组中元素的操作更加方便便捷。