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 @   陌客丁  阅读(254)  评论(0编辑  收藏  举报
编辑推荐:
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~
点击右上角即可分享
微信分享提示