当前位置: 首页 > news >正文

Java8-Stream流介绍和使用案例

Java 8 引入了 Stream API,它提供了一种高效且声明式的方式来处理集合数据。Stream 的核心思想是将数据的操作分为中间操作(Intermediate Operations)和终端操作(Terminal Operations),并通过流水线(Pipeline)的方式执行。

以下是 Java 8 Stream 的特性及常用案例:


1. Stream 的特性

1.1 声明式编程

Stream 使用声明式的方式处理数据,开发者只需关注“做什么”,而不是“怎么做”。例如:

list.stream().filter(x -> x > 10).forEach(System.out::println);

1.2 惰性求值(Lazy Evaluation)

Stream 的中间操作不会立即执行,只有在终端操作触发时才会执行。例如:

list.stream().filter(x -> x > 10); // 不会立即执行

1.3 不可重复使用

Stream 是一次性的,一旦执行了终端操作,Stream 就会被关闭,不能重复使用。

1.4 并行处理

Stream 可以轻松地并行化处理数据,只需调用 parallel() 方法:

list.parallelStream().filter(x -> x > 10).forEach(System.out::println);

2. Stream 的操作类型

2.1 中间操作(Intermediate Operations)

中间操作返回一个新的 Stream,可以链式调用。常见的中间操作包括:

  • filter():过滤元素。
  • map():将元素映射为另一种形式。
  • sorted():排序。
  • distinct():去重。
  • limit():限制元素数量。
  • skip():跳过前 N 个元素。

2.2 终端操作(Terminal Operations)

终端操作会触发 Stream 的执行,并返回一个非 Stream 的结果。常见的终端操作包括:

  • forEach():遍历元素。
  • collect():将 Stream 转换为集合。
  • reduce():将 Stream 中的元素归约为一个值。
  • count():统计元素数量。
  • anyMatch()allMatch()noneMatch():匹配元素。
  • findFirst()findAny():查找元素。

3. 常用案例

3.1 过滤数据

使用 filter() 过滤集合中满足条件的元素:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
List<Integer> evenNumbers = numbers.stream().filter(x -> x % 2 == 0).collect(Collectors.toList());
System.out.println(evenNumbers); // 输出: [2, 4, 6]

3.2 映射数据

使用 map() 将集合中的元素映射为另一种形式:

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<Integer> nameLengths = names.stream().map(String::length).collect(Collectors.toList());
System.out.println(nameLengths); // 输出: [5, 3, 7]

3.3 排序

使用 sorted() 对集合中的元素进行排序:

List<String> names = Arrays.asList("Charlie", "Alice", "Bob");
List<String> sortedNames = names.stream().sorted().collect(Collectors.toList());
System.out.println(sortedNames); // 输出: [Alice, Bob, Charlie]

3.4 去重

使用 distinct() 去除集合中的重复元素:

List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 4, 4, 5);
List<Integer> uniqueNumbers = numbers.stream().distinct().collect(Collectors.toList());
System.out.println(uniqueNumbers); // 输出: [1, 2, 3, 4, 5]

3.5 统计

使用 count() 统计元素数量:

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
long count = names.stream().count();
System.out.println(count); // 输出: 3

3.6 归约

使用 reduce() 将集合中的元素归约为一个值:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream().reduce(0, Integer::sum);
System.out.println(sum); // 输出: 15

3.7 分组

使用 Collectors.groupingBy() 对集合中的元素进行分组:

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "Anna");
Map<Character, List<String>> groupedNames = names.stream().collect(Collectors.groupingBy(name -> name.charAt(0)));
System.out.println(groupedNames); // 输出: {A=[Alice, Anna], B=[Bob], C=[Charlie]}

3.8 并行处理

使用 parallelStream() 并行处理数据:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> evenNumbers = numbers.parallelStream().filter(x -> x % 2 == 0).collect(Collectors.toList());
System.out.println(evenNumbers); // 输出: [2, 4, 6, 8, 10]

3.9 匹配

使用 anyMatch()allMatch()noneMatch() 进行匹配:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
boolean hasEven = numbers.stream().anyMatch(x -> x % 2 == 0);
boolean allEven = numbers.stream().allMatch(x -> x % 2 == 0);
boolean noneNegative = numbers.stream().noneMatch(x -> x < 0);System.out.println(hasEven);      // 输出: true
System.out.println(allEven);      // 输出: false
System.out.println(noneNegative); // 输出: true

3.10 查找

使用 findFirst()findAny() 查找元素:

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
Optional<String> first = names.stream().findFirst();
Optional<String> any = names.stream().findAny();System.out.println(first.get()); // 输出: Alice
System.out.println(any.get());  // 输出: Alice 或 Bob 或 Charlie

4. 总结

Java 8 的 Stream API 提供了一种高效、简洁的方式来处理集合数据。它的主要特点包括:

  • 声明式编程:代码更简洁易读。
  • 惰性求值:提高性能。
  • 并行处理:轻松实现并行化。

常用操作包括:

  • 过滤(filter)、映射(map)、排序(sorted)、去重(distinct)。
  • 统计(count)、归约(reduce)、分组(groupingBy)。
  • 匹配(anyMatchallMatchnoneMatch)、查找(findFirstfindAny)。

通过 Stream API,可以大大简化集合操作的代码,并提高开发效率。

相关文章:

Java8-Stream流介绍和使用案例

Java 8 引入了 Stream API&#xff0c;它提供了一种高效且声明式的方式来处理集合数据。Stream 的核心思想是将数据的操作分为中间操作&#xff08;Intermediate Operations&#xff09;和终端操作&#xff08;Terminal Operations&#xff09;&#xff0c;并通过流水线&#x…...

setlocale()的参数,“zh_CN.UTF-8“, “chs“, “chinese-simplified“的差异。

在 C/C 中&#xff0c;setlocale() 函数的参数 zh_CN.UTF-8、chs 和 chinese-simplified 均用于设置中文简体环境&#xff0c;但它们的语义、平台支持和编码行为存在显著差异&#xff1a; ​1. zh_CN.UTF-8&#xff08;推荐&#xff09;​ ​含义&#xff1a; zh_CN: 中文&…...

docker 安装达梦数据库(离线)

docker安装达梦数据库&#xff0c;官网上已经下载不了docker版本的了&#xff0c;下面可通过百度网盘下载 通过网盘分享的文件&#xff1a;dm8_20240715_x86_rh6_rq_single.tar.zip 链接: https://pan.baidu.com/s/1_ejcs_bRLZpICf69mPdK2w?pwdszj9 提取码: szj9 上传到服务…...

FastGPT 引申:如何基于 LLM 判断知识库的好坏

文章目录 如何基于 LLM 判断知识库的好坏方法概述示例 Prompt声明抽取器 Prompt声明检查器 Prompt 判断机制总结 下面介绍如何基于 LLM 判断知识库的好坏&#xff0c;并展示了如何利用声明抽取器和声明检查器这两个 prompt 构建评价体系。 如何基于 LLM 判断知识库的好坏 在知…...

关于2023新版PyCharm的使用

考虑到大家AI编程的需要&#xff0c;建议大家安装新版Python解释器和新版PyCharm&#xff0c;下载地址都可以官网进行&#xff1a; Python&#xff1a;Download Python | Python.org&#xff08;可以根据需要自行选择&#xff0c;建议选择3.11&#xff0c;保持交流版本一致&am…...

Leetcode 112: 路径总和

Leetcode 112: 路径总和 问题描述&#xff1a; 给定一个二叉树的根节点 root 和一个目标和 targetSum&#xff0c;判断是否存在从根节点到叶子节点的路径&#xff0c;使路径上所有节点的值相加等于目标和 targetSum。 适合面试的解法&#xff1a;递归 解法特点&#xff1a; …...

华为云IAM 用户名和IAM ID

账号 当您首次使用华为云时注册的账号&#xff0c;该账号是您的华为云资源归属、资源使用计费的主体&#xff0c;对其所拥有的资源及云服务具有完全的访问权限&#xff0c;可以重置用户密码、分配用户权限等。账号统一接收所有IAM用户进行资源操作时产生的费用账单。 账号不能…...

Compose Multiplatform+Kotlin Multiplatfrom 第四弹跨平台

文章目录 引言功能效果开发准备依赖使用gradle依赖库MVIFlow设计富文本显示 总结 引言 Compose Multiplatformkotlin Multiplatfrom 今天已经到compose v1.7.3&#xff0c;从界面UI框架上实战开发看&#xff0c;很多api都去掉实验性注解&#xff0c;表示稳定使用了&#xff01;…...

【Proteus仿真】【STM32单片机】全自动养护智能生态雨林缸

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器&#xff0c;使用按键、LCD1602液晶、DS18B20模块、PCF8591 ADC、浑浊传感器、PH传感器、液位传感器、继电器、水泵、酸碱调节剂、加热降温装置等。 主要功能&am…...

GBT32960 协议编解码器的设计与实现

GBT32960 协议编解码器的设计与实现 引言 在车联网领域&#xff0c;GBT32960 是一个重要的国家标准协议&#xff0c;用于新能源汽车与监控平台之间的数据交互。本文将详细介绍如何使用 Rust 实现一个高效可靠的 GBT32960 协议编解码器。 整体架构 编解码器的核心由三个主要组…...

SolidWorks 转 PDF3D 技术详解

在现代工程设计与制造流程中&#xff0c;不同软件间的数据交互与格式转换至关重要。将 SolidWorks 模型转换为 PDF3D 格式&#xff0c;能有效解决模型展示、数据共享以及跨平台协作等问题。本文将深入探讨 SolidWorks 转 PDF3D 的技术原理、操作流程及相关注意事项&#xff0c;…...

OpenMCU(二):GD32E23xx FreeRTOS移植

概述 本文主要描述了GD32E230移植FreeRTOS的简要步骤。移植描述过程中&#xff0c;忽略了Keil软件的部分使用技巧。默认读者熟练使用Keil软件。本文的描述是基于OpenMCU_FreeRTOS这个工程&#xff0c;该工程已经下载放好了移植GD32E230 FreeRTOS的所有文件 OpenMCU_FreeRTOS工程…...

Codeforces Round 835 (Div. 4)题解ABCDEFG

Problem - A - Codeforces 题意&#xff1a;你有 t 组数据&#xff0c;每组有两两不同的三个数 a,b,c&#xff0c;现在需要你求出他们的中位数。 思路&#xff1a;模拟即可 // Code Start Here int t;cin >> t;while(t--){vector<int> a(3);for(int i 0;i<3…...

NO1.C++语言基础|四种智能指针|内存分配情况|指针传擦和引用传参|const和static|c和c++的区别

1. 说⼀下你理解的 C 中的四种智能指针 智能指针的作用是管理指针&#xff0c;可以避免内存泄漏的发生。 智能指针就是一个类&#xff0c;当超出了类的作用域时&#xff0c;就会调用析构函数&#xff0c;这时就会自动释放资源。 所以智能指针作用的原理就是在函数结束时自动释…...

SQLite Having 子句详解

SQLite Having 子句详解 引言 SQLite 是一款轻量级的数据库管理系统,广泛应用于移动设备、嵌入式系统和各种桌面应用程序。在 SQL 查询中,HAVING 子句是用于过滤结果集的关键部分,尤其是在使用 GROUP BY 子句进行分组操作时。本文将详细解析 SQLite 中的 HAVING 子句,包括…...

Python数据分析面试题及参考答案

目录 处理 DataFrame 中多列缺失值的 5 种方法 批量替换指定列中的异常值为中位数 使用正则表达式清洗电话号码格式 合并两个存在部分重叠列的 DataFrame 将非结构化 JSON 日志转换为结构化表格 处理日期列中的多种非标准格式(如 "2023 年 12 月 / 05 日") 识…...

Spring Boot 3 整合 MinIO 实现分布式文件存储

引言 文件存储已成为一个做任何应用都不可回避的需求。传统的单机文件存储方案在面对大规模数据和高并发访问时往往力不从心&#xff0c;而分布式文件存储系统则提供了更好的解决方案。本篇文章我将基于Spring Boot 3 为大家讲解如何基于MinIO来实现分布式文件存储。 分布式存…...

ubuntu20 安装python2

1. 确保启用了 Universe 仓库 在某些情况下&#xff0c;python2-minimal 包可能位于 Universe 仓库中。你可以通过以下命令启用 Universe 仓库并更新软件包列表&#xff1a; bash复制 sudo add-apt-repository universe sudo apt update 然后尝试安装&#xff1a; bash复制…...

2025.3.3总结

周一这天&#xff0c;我约了绩效教练&#xff0c;主要想了解专业类绩效的考核方式以及想知道如何拿到一个更好的绩效。其他的岗位并不是很清楚&#xff0c;但是专业类的岗位&#xff0c;目前采取绝对考核&#xff0c;管理层和专家岗采取相对考核&#xff0c;有末尾淘汰。 通过…...

多线程-JUC源码

简介 JUC的核心是AQS&#xff0c;大部分锁都是基于AQS扩展出来的&#xff0c;这里先结合可重入锁和AQS&#xff0c;做一个讲解&#xff0c;其它的锁的实现方式也几乎类似 ReentrantLock和AQS AQS的基本结构 AQS&#xff0c;AbstractQueuedSynchronizer&#xff0c;抽象队列…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

从物理机到云原生:全面解析计算虚拟化技术的演进与应用

前言&#xff1a;我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM&#xff08;Java Virtual Machine&#xff09;让"一次编写&#xff0c;到处运行"成为可能。这个软件层面的虚拟化让我着迷&#xff0c;但直到后来接触VMware和Doc…...