StreamAPI常见操作

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);

猜你喜欢

转载自blog.csdn.net/qq_27046951/article/details/81355471