Java 8的Stream API:关于对象字段的处理

目录

  • 一、获取集合对象的某字段值集合
  • 二、对集合对象的字段进行重新赋值
  • 三、其他用法示例
    • 1. 过滤并收集特定条件的对象
    • 2. 分组(Grouping)
    • 3. 排序(Sorting)
    • 4. 统计(Reducing)
    • 5. 扁平化嵌套集合(Flattening)
    • 6. 匹配操作(Matching)
    • 7. 查找操作(Finding)
    • 8. 跳过与限制(Skip & Limit)
    • 9. 合并两个Stream(Concatenating Streams)
    • 10. 自定义收集器(Custom Collectors)

Java 8的Stream API提供了强大的功能来处理集合数据,包括获取集合中对象的某个字段值形成新的集合,以及对集合中的对象字段进行重新赋值。以下是这两种常见操作的示例和说明。

一、获取集合对象的某字段值集合

当你需要从一个对象集合中提取特定字段的值,形成一个新的集合时,可以使用map操作配合相应的getter方法,然后使用collect方法将结果收集到目标集合中,如List或Set。
示例:假设有一个Person类,包含name字段,现在要从一个Person对象列表中提取所有人的名字,形成一个字符串列表.

class Person {
    String name;
    // 省略构造函数、getter和setter...
}

List<Person> persons = ...; // 初始化的Person对象列表
List<String> names = persons.stream()
                            .map(Person::getName) // 使用方法引用获取name字段
                            .collect(Collectors.toList());

二、对集合对象的字段进行重新赋值

如果需要遍历集合并对其中每个对象的某个字段进行重新赋值,可以使用map操作创建新的对象实例,或者直接修改原对象(如果对象是可变的)。
示例:给定一个Order对象列表,需要为每个订单设置一个新的状态.

class Order {
    String id;
    String status;
    // 省略构造函数、getter和setter...
}

List<Order> orders = ...; // 初始化的Order对象列表
List<Order> updatedOrders = orders.stream()
                                 .map(order -> {
                                     order.setStatus("NEW_STATUS"); // 直接修改原对象状态
                                     return order; // 返回修改后的对象
                                 })
                                 .collect(Collectors.toList());

在这个例子中,我们直接修改了原对象的状态,然后返回该对象。如果Order类是不可变的,那么应该创建一个新的Order实例来代替修改原对象。
注意事项:对于不可变对象,使用map创建新对象而不是修改原对象。 在对集合进行转换或操作时,考虑是否需要并行处理(.parallelStream()),特别是处理大量数据时。 注意操作的终端方法(如collect)会触发实际的遍历和转换,之前的所有中间操作都是延迟执行的

三、其他用法示例

1. 过滤并收集特定条件的对象

如果你需要从集合中筛选出满足特定条件的元素,并收集到一个新的集合中,可以结合filter和collect方法。
示例:从Person列表中选出年龄大于20岁的人

class Person {
    String name;
    int age;
    // 省略构造函数、getter和setter...
}

List<Person> persons = ...; // 初始化的Person对象列表
List<Person> adults = persons.stream()
                             .filter(person -> person.getAge() > 20)
                             .collect(Collectors.toList());

2. 分组(Grouping)

使用collect方法配合Collectors.groupingBy,可以根据对象的某个字段进行分组。
示例:按性别分组人员。

Map<String, List<Person>> peopleByGender = persons.stream()
                                                 .collect(Collectors.groupingBy(Person::getGender));

3. 排序(Sorting)

Stream API允许你方便地对集合进行排序,无论是自然排序还是自定义排序规则。
示例:按年龄升序排序人员列表

List<Person> sortedPersons = persons.stream()
                                    .sorted(Comparator.comparingInt(Person::getAge))
                                    .collect(Collectors.toList());

4. 统计(Reducing)

reduce操作可以用来对集合元素进行累积操作,例如求和、求最大值、求最小值等。
示例:计算所有订单的总金额

class Order {
    double amount;
    // 省略构造函数、getter和setter...
}

List<Order> orders = ...; // 初始化的Order对象列表
double totalAmount = orders.stream()
                           .mapToDouble(Order::getAmount)
                           .reduce(0, Double::sum);

5. 扁平化嵌套集合(Flattening)

如果集合中有嵌套集合,可以使用flatMap来扁平化处理。
示例:假设每个Person有多个Email,现在要获取所有人的邮箱地址列表。

class Email {
    String address;
    // 省略构造函数、getter和setter...
}

class Person {
    List<Email> emails;
    // 省略构造函数、getter和setter...
}

List<String> allEmails = persons.stream()
                               .flatMap(person -> person.getEmails().stream())
                               .map(Email::getAddress)
                               .collect(Collectors.toList());

6. 匹配操作(Matching)

anyMatch:检查是否至少有一个元素满足条件。
allMatch:检查所有元素是否都满足条件。
noneMatch:检查没有元素满足条件。
示例:检查是否所有人都已成年。

boolean allAdults = persons.stream()
                           .allMatch(person -> person.getAge() >= 18);

7. 查找操作(Finding)

findFirst:返回第一个元素(按自然顺序或流的迭代顺序)。
findAny:返回任意元素。
max 和 min:找到最大或最小的元素,需配合Comparator。
示例:找到最年长的人。

Optional<Person> oldestPerson = persons.stream()
                                       .max(Comparator.comparingInt(Person::getAge));

8. 跳过与限制(Skip & Limit)

skip(n):跳过前n个元素。
limit(n):限制处理的元素数量为n。
示例:获取前3个成年人。

List<Person> firstThreeAdults = persons.stream()
                                       .filter(person -> person.getAge() >= 18)
                                       .limit(3)
                                       .collect(Collectors.toList());

9. 合并两个Stream(Concatenating Streams)

使用Stream.concat(stream1, stream2)可以合并两个Stream为一个。
示例:合并两个Person列表的Stream。

List<Person> groupA = ...;
List<Person> groupB = ...;
List<Person> combined = Stream.concat(groupA.stream(), groupB.stream())
                             .collect(Collectors.toList());

10. 自定义收集器(Custom Collectors)

通过Collectors.of方法,可以创建自定义的收集器来满足特定的收集需求。
示例:收集所有人的名字到一个自定义的字符串,名字之间用逗号连接。

Collector<Person, StringBuilder, String> nameCollector = Collector.of(
        StringBuilder::new,
        (sb, person) -> sb.append(sb.length() > 0 ? ", " : "").append(person.getName()),
        (sb1, sb2) -> sb1.append(sb2),
        StringBuilder::toString
);

String namesCombined = persons.stream().collect(nameCollector);

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

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

相关文章

<Rust><iced>在iced中显示gif动态图片的一种方法

前言 本文是在rust的GUI库iced中在窗口显示动态图片GIF格式图片的一种方法。 环境配置 系统&#xff1a;window 平台&#xff1a;visual studio code 语言&#xff1a;rust 库&#xff1a;iced、image 概述 在iced中&#xff0c;提供了image部件&#xff0c;从理论上说&…

软考 系统架构设计师系列知识点之杂项集萃(44)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之杂项集萃&#xff08;43&#xff09; 第71题 设有员工实体Employee&#xff08;员工号&#xff0c;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;电话&#xff0c;家庭住址&#xff0c;家庭成员&#xff0c;关系…

自动驾驶⻋辆环境感知:多传感器融合

目录 一、多传感器融合技术概述 二、基于传统方法的多传感器融合 三、基于深度学习的视觉和LiDAR的目标级融合 四、基于深度学习的视觉和LiDAR数据的前融合方法 概念介绍 同步和配准 时间同步 标定 摄像机内参标定&#xff08;使用OpenCV&#xff09; 摄像机与LiDAR外…

【FreeRTOS】任务状态改进播放控制

这里写目录标题 1 任务状态1.1 阻塞状态(Blocked)1.2 暂停状态(Suspended)1.3 就绪状态(Ready)1.4 完整的状态转换图 2 举个例子3 编写代码 参考《FreeRTOS入门与工程实践(基于DshanMCU-103).pdf》 本节课实现音乐任务的创建&#xff0c;音乐播放的暂停与继续播放&#xff0c;删…

java泛型学习

没有java泛型会存在的问题 假设我们有一个方法&#xff0c;希望通过传递不同类型的参数&#xff0c;输出不同类型的对象值。正常情况下我们可能会写不同的方法来实现&#xff0c;但是这样会导致类不断增加&#xff0c;并且类方法很相似&#xff0c;不能够复用。进而导致类爆炸…

C#实现音乐在线播放和下载——Windows程序设计作业3

1. 作业内容 编写一个C#程序&#xff0c;在作业二实现的本地播放功能的基础上&#xff0c;新增在线播放和在线下载功能&#xff0c;作业二博客地址&#xff1a;C#实现简单音乐文件解析播放——Windows程序设计作业2 2. 架构选择 考虑到需求中的界面友好和跨版本兼容性&#xf…

网站监控定时计划任务

网站监控是一种保护网站安全和稳定性的重要手段&#xff0c;而定时计划任务则是网站监控的一种常见方法。通过设置定时计划任务&#xff0c;可以定期对网站进行监测和检测&#xff0c;及时发现并解决潜在的问题&#xff0c;从而保障网站的正常运行。 首先&#xff0c;网站监控定…

AI播客下载:Eye on AI(AI深度洞察)

"Eye on A.I." 是一档双周播客节目&#xff0c;由长期担任《纽约时报》记者的 Craig S. Smith 主持。在每一集中&#xff0c;Craig 都会与在人工智能领域产生影响的人们交谈。该播客的目的是将渐进的进步置于更广阔的背景中&#xff0c;并考虑发展中的技术的全球影响…

MySQL的自增 ID 用完了,怎么办?

MySQL 自增 ID 一般用的数据类型是 INT 或 BIGINT&#xff0c;正常情况下这两种类型可以满足大多数应用的需求。 当然也有不正常的情况&#xff0c;当达到其最大值时&#xff0c;尝试插入新的记录会导致错误&#xff0c;错误信息类似于&#xff1a; ERROR 167 (22003): Out o…

【深度学习驱动流体力学】计算流体力学openfoam-paraview与python3交互

目的1:配置 ParaView 中的 Python Shell 和 Python 交互环境 ParaView 提供了强大的 Python 接口,允许用户通过 Python 脚本来控制和操作其可视化功能。在 ParaView 中,可以通过 View > Python Shell 菜单打开 Python Shell 窗口,用于执行 Python 代码。要确保正确配置 …

Mkdocs中文系列教程补充(1)

什么是requirements.txt 我的理解是mkdocs依赖的py库 第一次建立MKdocs文档使用 mkdocs new . 完后&#xff0c;比较建议执行一下&#xff1a; pip install -r requirements.txt 不然mkdocs serve后会出现什么 xxx not found &#xff0c;比如下面这位老哥 示例 mkdocs …

【大数据】—量化交易实战案例(基础策略)

声明&#xff1a;股市有风险&#xff0c;投资需谨慎&#xff01;本人没有系统学过金融知识&#xff0c;对股票有敬畏之心没有踏入其大门&#xff0c;所以只能写本文来模拟炒股。 量化交易&#xff0c;也被称为算法交易&#xff0c;是一种使用数学模型和计算机算法来分析市场数…

骑马与砍杀战团mod制作-基础-军队笔记(一)

骑马与砍杀战团mod制作-基础-军队装备笔记&#xff08;一&#xff09; 资料来源 学习的资料来源&#xff1a; b站【三啸解说】手把手教你做【骑砍】MOD&#xff0c;基础篇&#xff0c;链接为&#xff1a; https://www.bilibili.com/video/BV19x411Q7No?p4&vd_sourcea507…

设施布置之车间布局优化SLP分析

一 物流分析&#xff08;Flow Analysis&#xff09; 的基本方法 1、当物料移动是工艺过程的主要部分时&#xff0c;物流分析就是工厂布置设计的核心工作&#xff0c;也是物料搬运分析的开始。 2、零部件物流是该部件在工厂内移动时所走过的路线&#xff0c; 物流分析不仅要考虑…

Python18 数据结构与数据类型转换

1.python中的数据结构 在Python中&#xff0c;数据结构是用来存储、组织和管理数据的方式&#xff0c;以便有效地执行各种数据操作。Python提供了几种内置的数据结构&#xff0c;每种都有其特定的用途和操作方法。以下是Python中一些主要的数据结构&#xff1a; 1.列表&#…

Linux下Cmake安装或版本更新

下载Cmake源码 https://cmake.org/download/ 找到对应的版本和类型 放进linux环境解压 编译 安装 tar -vxvf cmake-3.13.0.tar.gz cd cmake-3.13.0 ./bootstrap make make install设置环境变量 vi ~/.bashrc在文件尾加入 export PATH/your_path/cmake-3.13.0/bin:$PAT…

css-vxe列表中ant进度条与百分比

1.vxe列表 ant进度条 <vxe-column field"actualProgress" title"进度" align"center" width"200"><template #default"{ row }"><a-progress:percent"Math.floor(row.actualProgress)"size"s…

KEIL5软件仿真观察PIN脚电平(软件仿真逻辑分析仪的使用)

仿真前的调整&#xff1a; 例&#xff1a;STM32F103C8T6 &#xff08;如果是F4的板子稍微对着修改一下&#xff09; 逻辑分析仪的使用 输入 PORTA.6( PORAT(哪一组).(哪一个引脚) )

【MySQL】

基础篇 执行一条 select 语句,期间发生了什么? 大家好,我是小林。 学习 SQL 的时候,大家肯定第一个先学到的就是 select 查询语句了,比如下面这句查询语句: // 在 product 表中,查询 id = 1 的记录 select * from product where id = 1;但是有没有想过,MySQL 执行一…