Stream流的使用

Stream使用


Stream和集合的差异在于:

  1. 集合包含当前数据结构中的所有值,是已经计算好的,Stream是按需计算
  2. 外部迭代和内部迭代:集合的数据是已经计算好的,迭代需要人工在外部代码进行管理,Stream是只需要告诉它你需要什么,它在内部帮你实现好,返回
  3. 一次性的流:和迭代器类似,只能迭代一次,使用过的流不可以再使用

常用方法

stream()/parallelStream()
    //示例
    list.stream();//return Stream<E>

/* filter(T->boolean)*/

//保留年龄为 20 的 person 元素
list = list.stream()
            .filter(person -> person.getAge() == 20)
            .collect(Collectors.toList());
distinct()
去除重复元素,这个方法是通过类的 equals 方法来判断两个元素是否相等的
sorted() / sorted((T, T) -> int)
    //如果流中的元素的类实现了Comparable的接口,即有自己的排序规则,可直接调用sorted()方法
    list = list.stream()
           .sorted((p1, p2) -> p1.getAge() - p2.getAge())
           .collect(Collectors.toList());
//可简化为
    list = list.stream()
           .sorted(Comparator.comparingInt(Person::getAge))
           .collect(Collectors.toList());
limit(long n)
//返回前n个元素
list = list.stream()
            .limit(2)
            .collect(Collectors.toList());
skip(long n)
//去除前n个元素
    list = list.stream()
            .skip(2)
            .collect(Collectors.toList());
map(T -> R)
    //将流中的每一个元素 T 映射为 R(类似类型转换)
    List<String> newlist = list.stream().map(Person::getName).collect(Collectors.toList());
flatMap(T -> Stream)
//将流中的每一个元素 T 映射为一个流,再把每一个流连接成为一个流。
    list = list.stream().map(s -> s.split(" ")).flatMap(Arrays::stream).collect(toList());
anyMatch(T -> boolean)
//流中是否有一个元素匹配给定的 T -> boolean 条件

//是否存在一个 person 对象的 age 等于 20:
   boolean b = list.stream().anyMatch(person -> person.getAge() == 20); 
allMatch(T -> boolean)
    //流中是否所有元素都匹配给定的 T -> boolean 条件
    boolean result = list.stream().allMatch(Person::isStudent);
noneMatch(T -> boolean)
//流中是否没有元素匹配给定的 T -> boolean 条件
    boolean result = list.stream().noneMatch(Person::isStudent);
findAny() 和 findFirst()
//findAny():找到其中一个元素 (使用 stream() 时找到的是第一个元素;使用 parallelStream()并行时找到的是其中一个元素)
//findFirst():找到第一个元素
count()
//返回流中元素个数,结果为 long 类型。
collect()
//收集方法,常用的是 collect(toList()),还有 collect(toSet()) 等,参数是一个收集器接口。
forEach()
//打印各个元素:
list.stream().forEach(System.out::println);
//向数据库插入新元素:
list.stream().forEach(PersonMapper::insertPerson);
//数值流转换为流
Stream<Integer> stream = intStream.boxed();
//groupingBy 用于将数据分组,最终返回一个 Map 类型
    Map<Integer, List<Person>> map = list.stream().collect(groupingBy(Person::getAge));
//多级分组
Map<Integer, Map<T, List<Person>>> map = list.stream().collect(groupingBy(Person::getAge, groupBy(...)));


//partitioningBy 分区
//分区与分组的区别在于,分区是按照 true 和 false 来分的
Map<Boolean, List<Person>> map = list.stream()
                                     .collect(partitioningBy(p -> p.getAge() <= 20));

posted @ 2021-03-03 10:31  陌客丁  阅读(241)  评论(0编辑  收藏  举报