Stream简介
Stream是Java8的新特性,它允许你一声明式的方式处理集合,可以把它看作是遍历数据集的高级迭代器.
Stream与lambada表示结合后编码效率大大提高,而且可读性更强
java8中的stream与(Inputstream&Outputsteam)是不同的概念
stream是对数据进行处理,进行各种操作,而非IO里的数据传输
Stream定义
“从支持数据处理操作的源,生成的元素序列”
元素列表:和集合一样,流也提供了一个接口,访问特定元素类型的一组有序值
数据源:获取数据的源,比如集合
数据处理操作:流更偏向于数据处理和计算,比如filter、map、find、sort等。简单来说,我们通过一个集合的stream方法获取一个流,然后对流进行一系列流操作,最后再构建成我们需要的数据集合
Stream处理数据过程
数组/集合类–>流—各种操作(排序,过滤)–>结果(数组/集合)
获取流
ArrayList<Integer> arrayList = new ArrayList<>();
arrayList.add(13);
arrayList.add(12);
arrayList.add(23);
//使用Collection 接口下的 stream()
Stream<Integer> stream = arrayList.stream();//将集合转换为一个流
Integer[] array = new Integer[]{1,2,3,4};
//使用Arrays 中的 stream() 方法,将数组转成流
Stream<Integer> stream1 = Arrays.stream(array);//把数组转换为一个流
//使用Stream中的静态方法:of()
Stream stream2 = Stream.of(1,2,3,4,5,6,7,8,9);//直接给stream赋值,参数为可变长度参数
流操作
流操作可以分为两类:中间操作和终端操作
中间操作
流的各种数据处理
filter:过滤流中的某些元素
sorted():自然排序,六中元素需要实现Comparable
distinct:去除重复船速
limit(n):获取n个元素
skip(n):跳过n个元素,配合limit(n)可以实现分页
map():将其映射成为一个新的元素
List<Integer> list = new ArrayList<>();
list.add(123);
list.add(13);
list.add(23);
list.add(23);
list.add(23);
list.add(1232);
list.add(22123);
list.add(12345);
list.stream().filter((e)->{
return e>20;//过滤小于等于20的数
}).distinct().sorted((o1,o2)->{
return o2-o1;//按照降序排序
}).forEach((e)->{
System.out.println(e);//遍历打印每个元素
});
终端操作
把流转为最终结果(数组/集合/单值)
forEach: 遍历流中的元素
toArray:将流中的元素倒入一个数组
Min:返回流中元素最小值
Max:返回流中元素最大值
count:返回流中元素的总个数
Reduce:所有元素求和
anyMatch:接收一个 Predicate 函数,只要流中有一个元素满足条件则返回true,否则返回false
allMatch:接收一个 Predicate 函数,当流中每个元素都符合条件时才返回true,否则返回false
findFirst:返回流中第一个元素
collect:将流中的元素倒入一个集合,Collection或Map
ArrayList arrayList = new ArrayList();
arrayList.add(1);
arrayList.add(1);
arrayList.add(3);
arrayList.add(2);
arrayList.add(6);
arrayList.add(4);
arrayList.add(8);
arrayList.add(22);
arrayList.add(12);
Stream<Integer> stream = arrayList.stream();
Integer num = stream.distinct()
.max((o1,o2)->{//终端操作取最大值
return o1-o2;
}).get();
System.out.println(num);//22
/*long num1 = stream.distinct().count();*/
/*System.out.println(num1);*/
/*Integer sum = stream.distinct().reduce(0,(o1,o2)->{
return o1+o2;
} );
System.out.println(sum);*/