Stream:是JDK8中处理集合的。是数据渠道,用于操作数据源(集合,数组)所生成的元素序列
使用Stream API对集合数据的操作,就类似于SQL执行数据库查询
Stream自己不储存元素
Stream对数据源不会产生影响,会返回一个持有结果的新Stream
先贴出待会操作需要的集合
List<Employ> emploies = Arrays.asList(
new Employ("张三", 18, 9999.99),
new Employ("李四", 59, 6666.66),
new Employ("王五", 28, 3333.33),
new Employ("赵六", 8, 7777.77),
new Employ("田七", 38, 5555.55),
new Employ("田七", 38, 5555.55)
);
Stream操作的三个步骤
1-创建Stream
//这是创建Stream常用的几种方式
public void createStream() {
//1.方式一 使用Conllection 系列集合提供的 stream() 方法
List<Employ> emploies = new ArrayList<>();
emploies.stream();
//2.方式二 通过Arrays中的静态方法stream(Array arr) 方法获得数组流
Employ [] ems = new Employ[5];
Arrays.stream(ems);
//3.方式三 通过Stream类中的静态方法
Stream.of(emploies);
}
2-中间操作
多个中间操作可以连接在一起形成一个流水线,除非触发终止操作,否则中间操作不会执行任何处理
在触发了终止操作的时候进行一次性处理,延迟加载
筛选与切片
//filter:接收Lambda从流中过滤元素
//获取年龄大于35岁的员工信息
emploies.stream()
.filter(e -> e.getAge() > 35)
.distinct()
.forEach(System.out::println);
//limit:截断,使元素不超过指定数量
//获取年龄大于35的员工,只取前两个
emploies.stream()
.filter(e -> e.getAge() > 35)
.distinct()
.limit(2)
.forEach(System.out::println);
//skip(n):跳过元素,返回一个扔掉前n个元素的流,和limit(n)互补
//distinct:筛选 hashCode和equals方法 去除重复元素
映射
map() 接收一个方法作为参数,该方法会被应用到每一个元素上,并将其映射成为一个新的元素
//获取所有员工的姓名
//流里面的每一个Employee都会执行getName()方法获取员工姓名,并返回到一个新的流中
emploies.stream()
.map(Employ::getName)//.map(e -> e.getName())
.forEach(System.out::println);
排序
//sorted() 按照元素 自然排序方式
//sorted(Comparator) 按照定制的方式排序
//寻找员工工资大于5000的员工,并按照工资由低到高排序
emploies.stream()
.filter(e -> e.getSalary() > 5000)
.sorted((e1,e2) -> Integer.compare(e1.getAge(),e2.getAge()))
.forEach(System.out::println);
3-终止操作
查找与匹配
//allMatch() 检查是否匹配所有元素
//是否所有的员工姓名都为张三(在这举个例子,肯定不匹配)
boolean allMatch = emploies.stream()
.allMatch(e -> e.getName().equals("张三"));
//anyMatch() 检查是否至少匹配一个元素
//是否有叫张三的员工
boolean anyMatch = emploies.stream()
.anyMatch(e -> e.getName().equals("张三"));
//noneMatch() 检查是否没有匹配所有的元素
//是否有叫XX的员工
boolean noneMatch = emploies.stream()
.noneMatch(e -> e.getName().equals("XX"));
//findFirst() 获取第一个元素
//获取工资最低的员工,先按照工资排序,再findFirst
Optional<Employ> findFirst = emploies.stream()
.sorted((e1,e2) -> Double.compare(e1.getSalary(), e2.getSalary()))
.findFirst();
//get()获取信息
System.out.println(findFirst.get());
//count() 返回流中元素的总个数
//查看工资大于6000的员工个数
long count = emploies.stream()
.filter(e -> e.getSalary() > 6000)
.count();
//max() 返回流中元素的最大值 max()和min()里面需要传一个比较器Comparator
//寻找年龄最大的员工
Optional<Employ> max = emploies.stream()
.max((e1,e2) -> Integer.compare(e1.getAge(), e2.getAge()));
//min() 返回流中元素的最小值
Optional<Employ> map = emploies.stream()
.min((e1,e2) -> Double.compare(e1.getSalary(), e2.getSalary()));
归约
//reduce:将流中的元素反复结合起来,成为一个值
//reduce(Integer::sum)
//获取所有员工的总工资
Optional<Double> reduce = emploies.stream()
.map(Employ::getSalary)//先将员工的工资提取出来放入流中
.reduce(Double::sum);//将流中所有的员工工资计算
System.out.println(reduce.get());
收集
//collect()
//Coolectors提供了很多静态的方法。可以将流中的元素收集到常用的集合中
//Collectors.averagingDouble 计算平均值
//获取所有员工的姓名存放到List集合中去
List<String> collect = emploies.stream()
.map(Employ::getName)
.collect(Collectors.toList());//toList() toSet()
//计算员工工资的平均值
Double averageSal = emploies.stream()
.collect(Collectors.averagingDouble(Employ::getSalary));
System.out.println(averageSal);