java Stream API的使用

Java Stream API 是 Java 8 引入的一个重要特性,它提供了一种高效且易于使用的处理集合的方式。Stream API 支持函数式编程风格,可以对集合进行复杂的转换和操作,如过滤、映射、排序、聚合等。

Stream API 的基本概念

Stream API 主要有三个核心组件:

  1. 源(Source):数据流的来源,通常是集合(如 ListSet 等)或其他数据结构。
  2. 中间操作(Intermediate Operations):一系列可以按顺序链接在一起的数据处理操作,如 filtermapsorted 等。
  3. 终止操作(Terminal Operations):结束流的操作,产生最终结果或副作用,如 collectforEachfindFirst 等。

Stream API 的基本使用

创建 Stream

创建 Stream 的常见方式有:

  1. 从集合创建 Stream

    • 使用集合的 stream() 或 parallelStream() 方法创建 Stream。
  2. 从数组创建 Stream

    • 使用 Arrays.stream(array) 方法创建 Stream。
  3. 从迭代器创建 Stream

    • 使用 Stream.iterate(seed, next) 方法创建无限流。
  4. 从生成器创建 Stream

    • 使用 Stream.generate(generator) 方法创建无限流。
中间操作(Intermediate Operations)

中间操作可以链接在一起,形成流水线式的处理过程。常见的中间操作包括:

  1. filter(Predicate<T> predicate):筛选元素。
  2. map(Function<T, R> mapper):转换元素。
  3. flatMap(Function<T, Stream<R>> mapper):将嵌套的 Stream 展平。
  4. distinct():去重。
  5. sorted():排序。
  6. peek(Consumer<T> action):打印或调试输出。
终止操作(Terminal Operations)

终止操作结束 Stream,产生最终结果或副作用。常见的终止操作包括:

  1. forEach(Consumer<T> action):遍历流中的每个元素。
  2. collect(Collector<T, A, R> collector):收集流中的元素。
  3. reduce(BinaryOperator<T>):聚合流中的元素。
  4. anyMatch(Predicate<T> predicate):判断是否有元素满足条件。
  5. allMatch(Predicate<T> predicate):判断所有元素是否满足条件。
  6. noneMatch(Predicate<T> predicate):判断是否有元素不满足条件。
  7. findFirst():获取第一个元素。
  8. findAny():获取任意一个元素。
  9. count():计算元素数量。
  10. max(Comparator<T> comparator):获取最大元素。
  11. min(Comparator<T> comparator):获取最小元素。

示例代码

示例 1:基本使用
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class StreamExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

        // 过滤偶数
        List<Integer> evenNumbers = numbers.stream()
                .filter(n -> n % 2 == 0)
                .collect(Collectors.toList());

        System.out.println(evenNumbers); // 输出 [2, 4, 6, 8, 10]

        // 映射平方
        List<Integer> squares = numbers.stream()
                .map(n -> n * n)
                .collect(Collectors.toList());

        System.out.println(squares); // 输出 [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

        // 排序
        List<Integer> sortedNumbers = numbers.stream()
                .sorted((a, b) -> b - a)
                .collect(Collectors.toList());

        System.out.println(sortedNumbers); // 输出 [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

        // 去重
        List<Integer> uniqueNumbers = numbers.stream()
                .distinct()
                .collect(Collectors.toList());

        System.out.println(uniqueNumbers); // 输出 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] (原列表已经是唯一的)

        // 遍历输出
        numbers.stream()
                .forEach(System.out::println);

        // 打印每个元素
        numbers.stream()
                .peek(System.out::println)
                .collect(Collectors.toList());
    }
}
示例 2:复杂操作
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class ComplexStreamExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David", "Eve");

        // 过滤长度大于 5 的名字,并转换成大写
        List<String> longNamesUpper = names.stream()
                .filter(name -> name.length() > 5)
                .map(String::toUpperCase)
                .collect(Collectors.toList());

        System.out.println(longNamesUpper); // 输出 [CHARLIE, DAVID]

        // 计算名字长度的总和
        int totalLength = names.stream()
                .mapToInt(String::length)
                .sum();

        System.out.println(totalLength); // 输出 23

        // 检查是否有名字长度大于 5
        boolean hasLongName = names.stream()
                .anyMatch(name -> name.length() > 5);

        System.out.println(hasLongName); // 输出 true

        // 获取最长的名字
        String longestName = names.stream()
                .max(Comparator.comparingInt(String::length))
                .orElse(null);

        System.out.println(longestName); // 输出 Charlie

        // 获取最短的名字
        String shortestName = names.stream()
                .min(Comparator.comparingInt(String::length))
                .orElse(null);

        System.out.println(shortestName); // 输出 Bob

        // 分组统计每个名字的长度出现次数
        Map<Integer, Long> lengthCount = names.stream()
                .collect(Collectors.groupingBy(String::length, Collectors.counting()));

        System.out.println(lengthCount); // 输出 {3=2, 5=1, 6=1, 7=1}

        // 归约操作
        int product = names.stream()
                .mapToInt(name -> name.length())
                .reduce(1, (a, b) -> a * b);

        System.out.println(product); // 输出 34560
    }
}

Stream API 的高级用法

1. 并行流(Parallel Streams)

并行流可以提高处理大量数据时的效率。

import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;

public class ParallelStreamExample {
    public static void main(String[] args) {
        Random random = new Random();
        List<Integer> numbers = IntStream.rangeClosed(1, 1000000)
                .boxed()
                .collect(Collectors.toList());

        // 使用并行流计算总和
        long parallelSum = numbers.parallelStream()
                .reduce(0L, Long::sum);

        System.out.println(parallelSum); // 输出 500000500000
    }
}
2. 构建复杂的数据结构
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class ComplexDataStructureExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David", "Eve");

        // 构建一个 Map,键是名字长度,值是对应的名字列表
        Map<Integer, List<String>> lengthToNames = names.stream()
                .collect(Collectors.groupingBy(String::length));

        System.out.println(lengthToNames); // 输出 {3=[Bob, Eve], 5=[Alice], 7=[Charlie], 6=[David]}
    }
}

总结

Java Stream API 提供了一种高效且易于使用的处理集合的方式。通过使用 Stream API,可以轻松实现复杂的集合操作,如过滤、映射、排序、聚合等。掌握 Stream API 的基本概念和用法后,可以更好地利用这些特性来编写高效、简洁的 Java 应用程序。

通过上述示例代码,可以看到 Stream API 如何简化集合操作,并提供更多的功能和灵活性。无论是简单的筛选和映射,还是复杂的聚合和分组,Stream API 都能够胜任。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/888890.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】栈和队列 + 经典算法题

目录 前言 一、栈 二、栈的实现 三、栈的循环遍历演示 四、栈的算法题 // 一、队列 二、队列的实现 三、使用演示 四、队列的算法题 总结 前言 本文完整实现了栈和队列的数据结构&#xff0c;以及栈和队列的一些经典算法题&#xff0c;让我们更加清楚了解这两种数据…

昇思MindSpore进阶教程--数据处理性能优化(中)

大家好&#xff0c;我是刘明&#xff0c;明志科技创始人&#xff0c;华为昇思MindSpore布道师。 技术上主攻前端开发、鸿蒙开发和AI算法研究。 努力为大家带来持续的技术分享&#xff0c;如果你也喜欢我的文章&#xff0c;就点个关注吧 shuffle性能优化 shuffle操作主要是对有…

PCB缺陷检测数据集 xml 可转yolo格式 ,共10688张图片

PCB缺陷检测数据集&#xff08;yolov5,v7,v8&#xff09; 数据集总共有两个文件夹&#xff0c;一个是pcb整体标注&#xff0c;一个是pcb部分截图。 整体标注有6个分类&#xff0c;开路&#xff0c;短路等都已经标注&#xff0c;标注格式为xml&#xff0c;每个文件夹下有100多张…

vue3 环境配置vue-i8n国际化

一.依赖和插件的安装 主要是vue-i18n和 vscode的自动化插件i18n Ally https://vue-i18n.intlify.dev/ npm install vue-i18n10 pnpm add vue-i18n10 yarn add vue-i18n10 vscode在应用商城中搜索i18n Ally&#xff1a;如图 二.实操 安装完以后在对应项目中的跟package.jso…

探索Python的工业通信之光:pymodbus的奇妙之旅

文章目录 探索Python的工业通信之光&#xff1a;pymodbus的奇妙之旅背景&#xff1a;为何选择pymodbus&#xff1f;pymodbus是什么&#xff1f;如何安装pymodbus&#xff1f;5个简单的库函数使用方法3个场景使用示例常见bug及解决方案总结 探索Python的工业通信之光&#xff1a…

排序|插入排序|希尔排序|直接选择排序|堆排序的实现即特性(C)

插入排序 基本思想 直接插入排序是一种简单的插入排序法&#xff0c;其基本思想是&#xff1a; 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 。 单趟 当插入第 i ( i ≤ 1…

共享单车轨迹数据分析:以厦门市共享单车数据为例(十)

副标题&#xff1a;共享单车与地铁站出入口分布情况探究——以厦门市为例 假期结束了&#xff0c;我们满血复活&#xff0c;继续更新&#xff01; 本篇文章我们讨论共享单车与地铁出入口的关系&#xff0c;在上一篇文章中&#xff0c;我们讨论了综合得分指数最高的地铁站——…

Windows系统安装Docker

文章参考&#xff1a;Windows 安装docker&#xff08;详细图解&#xff09;-CSDN博客 安装包下载&#xff1a; 安装wsl的官方文档&#xff1a;安装 WSL | Microsoft Learn 查看windows相关配置 打开 (CTRLALTDELETE) 任务管理器 -> 选择性能 -> CPU ->虚拟化&#…

【重学 MySQL】四十七、表的操作技巧——修改、重命名、删除与清空

【重学 MySQL】四十七、表的操作技巧——修改、重命名、删除与清空 修改表添加字段语法示例注意事项 删除字段语法示例 修改字段使用 MODIFY COLUMN语法示例 使用 CHANGE COLUMN语法示例 重命名表语法示例 删除表语法示例 清空表使用 TRUNCATE TABLE使用 DELETE FROM对比 TRUNC…

处理Java内存溢出问题(java.lang.OutOfMemoryError):增加JVM堆内存与调优

处理Java内存溢出问题&#xff08;java.lang.OutOfMemoryError&#xff09;&#xff1a;增加JVM堆内存与调优 在进行压力测试时&#xff0c;遇到java.lang.OutOfMemoryError: Java heap space错误或者nginx报错no live upstreams while connecting to upstream通常意味着应用的…

Unity MVC框架演示 1-1 理论分析

本文仅作学习笔记分享与交流&#xff0c;不做任何商业用途&#xff0c;该课程资源来源于唐老狮 1.一般的图解MVC 什么是MVC我就不说了&#xff0c;老生常谈&#xff0c;网上有大量的介绍&#xff0c;想看看这三层都起到什么职责&#xff1f;那就直接上图吧 2.我举一个栗子 我有…

OpenSource - License 开源项目 TrueLicense

文章目录 官网集成Demo 官网 https://truelicense.namespace.global/ https://github.com/christian-schlichtherle/truelicense 集成Demo https://github.com/christian-schlichtherle/truelicense-maven-archetype https://github.com/zifangsky/LicenseDemo https://git…

机器学习——多模态学习

多模态学习&#xff1a;机器学习领域的新视野 引言 多模态学习&#xff08;Multimodal Learning&#xff09;是机器学习中的一个前沿领域&#xff0c;它涉及处理和整合来自多个数据模式&#xff08;如图像、文本、音频等&#xff09;的信息。随着深度学习的蓬勃发展&#xff0…

2020年华为杯数学建模竞赛D题论文和代码

无人机集群协同对抗 摘 要&#xff1a; 本文针对非线性约束条件下红蓝双方无人机集群协同对抗的最优规划问题&#xff0c;结合贪婪队形、非线性规划、内点法、蒙特卡洛方法和全联立正交配置有限元法&#xff0c;构建了无人机集群协同对抗推演模型。 针对问题一&#…

【刷题7】寻找数组的中心下标、和为k的子数组、和可被k整除的子数组

目录 一、寻找数组的中心下标二、和为k的子数组三、和可被k整除的子数组 一、寻找数组的中心下标 题目&#xff1a; 思路&#xff1a;前缀和思想 预处理一个前缀和数组和一个后缀和数组&#xff0c;当前指向的元素的值不包括在数组的元素和中&#xff1b;前缀和数组的公式…

网络受限情况下安装openpyxl模块提示缺少Jdcal,et_xmlfile

1.工作需要处理关于Excel文件内容的东西 2.用公司提供的openpyxl模块总是提示缺少jdcal文件,因为网络管控,又没办法直接使用命令下载&#xff0c;所以网上找了资源&#xff0c;下载好后上传到个人资源里了 资源路径 openpyxl jdcal et_xmlfile 以上模块来源于&#xff1a;Py…

数据湖数据仓库数据集市数据清理以及DataOps

一提到大数据我们就知道是海量数据&#xff0c;但是我们并不了解需要从哪些维度去考虑这些数据的存储。比如 数据湖、数据仓库、数据集市&#xff0c;以及数据自动化应用DataOps有哪些实现方式和实际应用&#xff0c;这篇文章将浅显的做一次介绍。 数据湖 数据湖是一种以自然…

已解决:org.springframework.web.HttpMediaTypeNotAcceptableException

文章目录 写在前面问题描述报错原因分析&#xff1a; 解决思路解决办法1. 确保客户端请求的 Accept 头正确2. 修改 Controller 方法的 produces 参数3. 配置合适的消息转换器4. 检查 Spring 配置中的媒体类型5. 其他解决方案 总结 写在前面 在开发过程中&#xff0c;Spring 框…

Matlab数据预处理——最小二乘法消除多项式趋势项

关注公众号“电击小子程高兴的MATLAB小屋”获取专属优惠 概要&#xff1a; 最小二乘法是一种常用的统计方法&#xff0c;用于通过拟合数据来消除多项式趋势项。以下是关于如何使用最小二乘法消除多项式趋势项的步骤和概念&#xff1a; 概念&#xff1a; 多项式趋势项&#…

JavaWeb 14.详解TCP协议的三次握手和四次挥手

目录 一、TCP协议与UDP协议 二、TCP协议 1、建立连接&#xff08;三次握手&#xff09; 过程 2、断开连接&#xff08;四次挥手&#xff09; 过程 国庆节快乐&#xff01; 一文详解TCP协议中的三次握手建立连接和四次挥手断开连接 —— 24.10.3 一、TCP协议与UDP协议 tcp协议与…