lamdba03 Java8新特性之四:Stream API
发布日期:2021-05-08 03:02:37 浏览次数:32 分类:精选文章

本文共 1884 字,大约阅读时间需要 6 分钟。

Java 8 Stream API入门与实践指南

Java 8的Stream API是处理集合操作的革命性改变,它通过提供一种灵活且高效的方式来操作数据集合。这一特性不仅简化了代码,还提高了性能,特别是在处理大数据量时表现尤为突出。本文将从基础到应用,全面探讨Stream API的功能和使用方法。


Stream的操作步骤

Stream API的核心在于分三步完成操作:

  • 创建Stream:从数据源(如集合、数组)获取Stream对象。
  • 中间操作:通过多个方法对Stream进行筛选、切片、映射等操作。
  • 终止操作:执行中间操作并产生最终结果。

  • Stream的基本用法示例

    创建Stream

    List
    personList = new ArrayList<>();// 初始化人对象personList.add(new Person("欧阳雪", 18, "中国", 'F'));// 其他对象初始化类似...

    基本操作

    过滤操作

    // 过滤年龄大于18岁的人并输出personList.stream().filter(t -> t.getAge() > 20).forEach(t -> System.out.println(t));

    统计操作

    // 计算中国人的数量long chinaCount = personList.stream().filter(t -> "中国".equals(t.getCountry())).count();System.out.println(chinaCount);

    Stream中间操作

    筛选与切片

    • filter:基于条件筛选元素。
    • limit:限制流的大小。
    • skip:跳过指定数量的元素。
    • distinct:去重。

    映射操作

    • map:将元素映射为另一个对象。
    • flatMap:将元素映射为另一个Stream。

    排序操作

    // 按年龄从小到大排序,年龄相同则按姓名排序personList.stream().sorted((o1, o2) -> {    if (o1.getAge() == o2.getAge()) {        return o1.getName().compareTo(o2.getName());    }    return o1.getAge() - o2.getAge();}).forEach(System.out::println);

    终止操作

    查找与匹配

    • anyMatch:检查是否存在满足条件的元素。
    • allMatch:检查所有元素是否满足条件。
    • findFirst:返回第一个匹配元素。
    • findAny:返回任意一个匹配元素。

    统计操作

    • count:返回元素总数。
    • maxmin:返回最大值、最小值。

    归约操作

    • reduce:将流中的元素结合起来,得到一个值。

    实际应用示例

    求年龄之和

    // 将年龄转换为整数流并求和int ageSum = personList.stream()    .map(Person::getAge)    .reduce((t, u) -> t + u);System.out.println(ageSum);

    求平均年龄

    // 使用平均值计算器double averageAge = personList.stream()    .collect(Collectors.averagingDouble(t -> t.getAge()));System.out.println(averageAge);

    求最大年龄

    // 使用最大值收集器Optional
    maxAgePerson = personList.stream() .collect(Collectors.maxBy((o1, o2) -> o1.getAge() - o2.getAge()));System.out.println(maxAgePerson.get().getName());

    注意事项

  • 流的关闭:在使用资源密集型操作时,建议将Stream及时关闭。
  • 并行Stream:通过parallelStream()可以提升性能,但需谨慎处理状态和共享变量。

  • 总结

    Stream API为Java程序员提供了一种强大的数据处理工具,简化了代码逻辑并提高了效率。通过合理运用filtermapsorted等中间操作,以及countreduce等终止操作,可以实现复杂的数据处理任务。希望本文能为您提供深入的理解和实践指导!

    上一篇:Html点击按钮自动刷新页面问题
    下一篇:SpringBoot学习笔记02

    发表评论

    最新留言

    做的很好,不错不错
    [***.243.131.199]2025年04月28日 03时09分40秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章

    Kubernetes学习总结(18)—— Kubernetes 容器网络 2023-01-29
    Kubernetes学习总结(1)——Kubernetes入门简介 2023-01-29
    Kubernetes学习总结(2)——Kubernetes设计架构 2023-01-29
    Kubernetes学习总结(3)——一年时间打造全球最大规模之一的Kubernetes集群,蚂蚁金服怎么做到的? 2023-01-29
    Kubernetes学习总结(4)——Kubernetes v1.20 重磅发布 | 新版本核心主题 & 主要变化解读 2023-01-29
    Kubernetes学习总结(5)——Kubernetes 常见面试题汇总 2023-01-29
    Kubernetes学习总结(6)——Kubernetes 7周年:它为什么如此受欢迎? 2023-01-29
    Kubernetes学习总结(7)——学习 Kubernetes 的 Pod 2023-01-29
    Kubernetes学习总结(8)—— Kubernetes Pod 资源管理 和 Pod 服务质量 2023-01-29
    Kubernetes学习总结(9)—— 基础架构的未来是 K8s,那么 K8s 的未来在何方? 2023-01-29
    kubernetes实战(十三):k8s使用helm持久化部署harbor集成openLDAP登录 2023-01-29
    Kubernetes实战(一)-Kubernetes集群搭建 2023-01-29
    Kubernetes实战(七)-优先级调度(Pod Priority Preemption) 2023-01-29
    Kubernetes实战(三十一)-Calico网络部署(推荐) 2023-01-29
    Kubernetes实战(三十三)-外部Etcd集群部署与调优(更安全的数据存储策略) 2023-01-29
    Kubernetes实战(三十二)-Kubeadm 安装 Kubernetes v1.24.0 2023-01-29
    Kubernetes实战(三)-定向调度(NodeSelector) 2023-01-29
    Kubernetes实战(二十九)-集群资源管理(CPU & Memory) 2023-01-29
    Kubernetes实战(二十二)-Etcd 集群部署(安全) 2023-01-29
    Kubernetes实战(二十五)-Flannel 网络部署(不推荐,不支持 Etcd3) 2023-01-29