map()结合其他的实际使用

map() 是 Java Stream API 中一个非常重要的中间操作,用于将流中的每个元素应用一个函数并返回一个新的流。它的作用是将输入的元素“映射”到一个新的元素上,通常用于转换数据的结构或类型。

1. map() 的基础用法

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]

解释:这里我们用 map() 将字符串流转换成其长度的整数流。每个名字(如 “Alice”)经过 String::length 处理后,变成了一个整数。

2. map()filter() 的结合

map()filter() 经常结合使用。filter() 用于筛选元素,而 map() 用于转换筛选后的元素。

示例:筛选并转换整数列表

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);List<Integer> squaredEvens = numbers.stream().filter(n -> n % 2 == 0)  // 筛选偶数.map(n -> n * n)          // 将筛选后的偶数映射为它们的平方.collect(Collectors.toList());System.out.println(squaredEvens);  // 输出:[4, 16, 36, 64, 100]

解释:首先通过 filter() 筛选出偶数,然后使用 map() 将偶数转换为它们的平方。最终结果是 [4, 16, 36, 64, 100]

3. map()reduce() 的结合

map() 可以与 reduce() 结合,实现将数据转换后再进行归约操作。典型应用场景是处理和汇总数据。

示例:计算平方数的总和

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);int sumOfSquares = numbers.stream().map(n -> n * n)       // 将每个数字映射为它的平方.reduce(0, Integer::sum);  // 求和System.out.println(sumOfSquares);  // 输出:55

解释map() 将每个数字转换为它的平方,然后 reduce() 将这些平方值累加得到总和。最终结果是 1 + 4 + 9 + 16 + 25 = 55

4. map()flatMap() 的区别

map()flatMap() 的区别在于:map() 是一对一的映射,而 flatMap() 是一对多的映射,通常用于将多个嵌套集合“展开”。

示例:使用 map() 处理嵌套集合

List<List<String>> nestedList = Arrays.asList(Arrays.asList("Apple", "Banana"),Arrays.asList("Orange", "Grapes")
);List<String> flatList = nestedList.stream().flatMap(List::stream)  // 将每个列表展平为单个流.collect(Collectors.toList());System.out.println(flatList);  // 输出:[Apple, Banana, Orange, Grapes]

解释flatMap() 将嵌套的 List 打平,使其成为单个元素的流。map() 不能做到这一点,因为它只进行单一的映射,而不“展开”嵌套结构。

5. map()collect() 的结合

map() 可以结合 collect() 操作,将流中的元素转换并收集到集合中。

示例:将对象的属性值映射并收集

假设我们有一个 Person 对象,想提取每个人的名字并将其收集到一个列表中:

class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}
}List<Person> people = Arrays.asList(new Person("Alice", 30),new Person("Bob", 25),new Person("Charlie", 35)
);List<String> names = people.stream().map(Person::getName)  // 映射每个 Person 对象为其名字.collect(Collectors.toList());System.out.println(names);  // 输出:[Alice, Bob, Charlie]

解释map()Person 对象的流映射为名字的流,最终通过 collect() 将结果收集到一个 List 中。

6. map()forEach() 的结合

map() 可以将流中的元素映射为其他类型或对象,forEach() 则可以对每个映射后的元素进行操作。

示例:打印处理后的元素

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");names.stream().map(String::toUpperCase)  // 将名字转换为大写.forEach(System.out::println);  // 输出每个名字// 输出:
// ALICE
// BOB
// CHARLIE

解释map() 将每个名字转换为大写,然后通过 forEach() 输出结果。

7. map()sorted() 的结合

map() 可以将元素映射为可排序的类型,然后使用 sorted() 对结果进行排序。

示例:对字符串长度进行排序

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");List<String> sortedByLength = names.stream().sorted(Comparator.comparingInt(String::length))  // 按字符串长度排序.collect(Collectors.toList());System.out.println(sortedByLength);  // 输出:[Bob, Alice, Charlie]

解释sorted() 按照字符串的长度对流进行排序。通过结合 map(),你可以先将对象映射为其某些属性,然后基于这些属性排序。

8. map()groupingBy() 的结合

map()Collectors.groupingBy() 结合使用时,可以先映射元素然后按特定标准分组。

示例:按名称长度分组

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");Map<Integer, List<String>> namesByLength = names.stream().collect(Collectors.groupingBy(String::length));  // 按名字长度分组System.out.println(namesByLength);
// 输出:{3=[Bob], 5=[Alice, David], 7=[Charlie]}

解释:这里我们按名字的长度将它们分组,通过 groupingBy() 来实现。

9. map()max()min() 的结合

你可以通过 map() 先转换元素,然后用 max()min() 找出最大或最小值。

示例:找出最长的名字

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");Optional<String> longestName = names.stream().max(Comparator.comparingInt(String::length));  // 找出长度最长的名字longestName.ifPresent(System.out::println);  // 输出:Charlie

解释max() 基于名字的长度比较并找出最长的名字。

10. 结合实际开发场景的 map() 使用

在实际开发中,map() 通常用于将数据转换成某种需要的结构,或者从对象中提取出关键信息。在结合数据库查询、JSON 解析、REST API 响应处理时,map() 是一个非常有用的工具。

示例:从 API 响应中提取数据

假设我们从 API 得到一个用户对象的列表,想要提取每个用户的 ID:

List<JSONObject> users = apiResponse.getJSONArray("users").toJavaList(JSONObject.class);List<Integer> userIds = users.stream().map(user -> user.getInteger("id"))  // 提取用户 ID.collect(Collectors.toList());System.out.println(userIds);  // 输出所有用户的 ID 列表

总结

  • map() 用于将流中的元素通过一个函数映射到新的元素。
  • 可以结合 filter() 筛选数据,reduce() 进行归约,flatMap() 展开嵌套结构,collect() 收集结果。
  • 在实际开发中,map() 非常适合用来转换对象

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

机器人末端的负载辨识

关节处的摩擦力变小了&#xff0c;导致系统的参数辨识精度会变高&#xff0c;因为动力学方程中的摩擦力项占的比例会变小。 为什么要有一个负载的参数辨识&#xff0c;因为对于整个系统来说&#xff0c;除了负载哈&#xff0c;其他关节都是不变的&#xff0c;出厂时都设置好了&…

Java基础-知识点

文章目录 数据类型包装类型缓存池 String概述不可变的含义不可变的好处String、StringBuffer、StringBuilderString.intern() 运算参数传递float与double隐式类型转换switch 继承访问权限抽象类与接口super重写与重载**1. 重写(Override)****2. 重载(Overload)** Object类的通用…

FFMPEG数据封装格式、多媒体传输协议、音视频编解码器

FFMPEG堪称自由软件中最完备的一套多媒体支持库&#xff0c;它几乎实现了所有当下常见的数据封装格式、多媒体传输协议以及音视频编解码器&#xff0c;提供了录制、转换以及流化音视频的完整解决方案。 ffmpeg命令行参数解释 ffmpeg -i [输入文件名] [参数选项] -f [格式] [输出…

速通!腾讯发布《2024大模型十大趋势》

【写在前面】 腾讯发布的《2024大模型十大趋势》报告在2024世界人工智能大会上引起了广泛关注。该报告深入分析了人工智能领域的最新进展&#xff0c;特别是大模型技术在不同应用场景中的潜力和影响&#xff0c;并预测了未来人工智能的发展方向。 “大模型技术发展方向 大模型…

深入理解HTTP Cookie

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; 目录 HTTP Cookie定义工作原理分类安全性用途 认识 cookie基本格式实验测试 cookie 当我们登录了B站过后&#xff0c;为什么下次访问B站就…

光伏电站灰尘监测系统的工作原理

型号&#xff1a;TH-HS1】光伏电站灰尘监测系统是一种专门用于监测光伏电站内部灰尘积累情况的系统&#xff0c;通过安装在太阳能电池板表面的传感器&#xff0c;实时收集电池板表面的灰尘信息&#xff0c;包括灰尘厚度、污染比、洁净比等&#xff0c;并将这些数据发送到中央处…

杨中科 ASP.NETCORE 异步编程二

一、不要用sleep() 如果想在异步方法中暂停一段时间&#xff0c;不要用Thread.sleep()&#xff0c;因为它会阻塞调用线程&#xff0c;而要用await.Task.Delay()。 举例: 下载一个网址,3秒后下载另一个 示例&#xff1a; sleep() 为了能直观看到效果&#xff0c;使用winfor…

【STM32开发之寄存器版】(八)-定时器的编码器接口模式

一、前言 1.1 编码器接口原理 编码器模式主要用于检测旋转编码器的转动方向和转动速度。旋转编码器一般输出两路相位相差90度的脉冲信号&#xff08;称为A相和B相&#xff09;&#xff0c;通过这两路信号&#xff0c;定时器可以判断编码器的旋转方向&#xff0c;并计数转动的脉…

新同事半天搭建了一套CRM系统,实力赢得老板青睐直接转正

我们都知道&#xff0c;搭建一套CRM系统&#xff0c;根据功能和数据的复杂性&#xff0c;一般需要2至4周才能完成。最近&#xff0c;我们团队新来了一位同事&#xff0c;之前做过产品&#xff0c;没写过代码。老板安排他试试能不能搭建一套CRM系统&#xff0c;主要用于市场部同…

【学术会议征稿】第五届应用力学与机械工程国际学术会议(ICAMME 2024)

第五届应用力学与机械工程国际学术会议&#xff08;ICAMME 2024&#xff09; 2024 5th International Conference on Applied Mechanics and Mechanical Engineering 在全球技术快速发展的背景下&#xff0c;应用力学和机械工程作为推动现代工业创新的根基&#xff0c;持续展…

解决html2canvas图片模糊不清,超出一页长截图问题

前言 最近需要做一个页面截图功能&#xff0c;类似QQ、微信截图功能&#xff0c;核心是将Html网页转换成图片格式&#xff0c;并且尽可能保证截图后图片样式和原网页一致。对比了一些第三方插件以及浏览器自带的API&#xff0c;最终选择使用JavaScript库‌&#xff1a;如html2…

【读书笔记·VLSI电路设计方法解密】问题7:什么是基于标准单元的专用集成电路 (ASIC) 设计方法论

标准单元方法论是一种基于预组装库单元的芯片设计方法。该库中包含的标准单元和宏单元(例如存储器、I/O、特殊功能单元、锁相环(PLLs)等)已经在预定的工艺节点中设计、布局并经过验证。这些单元经过完全表征,并在逻辑、时序、物理和电气模型方面进行了定义,并正确地打包在…

【学术会议征稿】2024年智能通信、感知与电磁学术会议(ICSE 2024)

2024年智能通信、感知与电磁学术会议&#xff08;ICSE 2024&#xff09; 2024 International Conference on Intelligent Communication, Sensing and Electromagnetics 2024年智能通信、感知与电磁学术会议&#xff08;ICSE 2024&#xff09;将于2024年12月13-15日在中国-广…

【AI系统】AI在不同领域的应用与行业影响

本文将探讨AI在不同技术领域和行业中的广泛应用&#xff0c;以及这些应用如何影响和改变我们的世界。 I. 引言 AI技术正日益渗透到各个技术领域&#xff0c;从计算机视觉到自然语言处理&#xff0c;再到音频处理&#xff0c;AI的应用正变得越来越广泛。这些技术的发展不仅推动…

TMtech凯珏LED驱动芯片T8332AD升降压线性

T8332AD 是 TM Technology, Inc. 设计的一款多功能 LED 驱动 IC。它具有广泛的输入电压范围、精确的恒流控制和多种保护机制&#xff0c;非常适合各种大功率 LED 应用。以下是其主要特点、应用和技术规格的概述。 主要特点 1. 宽输入电压范围&#xff1a;在 5V 到 60V 之间高…

平衡树 BTree和B+Tree

B树索引是B树在数据库中的一种实现&#xff0c;是最常见也是数据库中使用最为频繁的一种索引。B树中的B代表平衡&#xff08;balance&#xff09;&#xff0c;而不是二叉&#xff08;binary&#xff09;&#xff0c;因为B树是从最早的平衡二叉树演化而来的。在讲B树之前必须先了…

41 | 单例模式(上):为什么说支持懒加载的双重检测不比饿汉式更优?

从今天开始&#xff0c;我们正式进入到设计模式的学习。我们知道&#xff0c;经典的设计模式有 23 种。其中&#xff0c;常用的并不是很多。据我的工作经验来看&#xff0c;常用的可能都不到一半。如果随便抓一个程序员&#xff0c;让他说一说最熟悉的 3 种设计模式&#xff0c…

2015年国赛高教杯数学建模C题月上柳梢头解题全过程文档及程序

2015年国赛高教杯数学建模 C题 月上柳梢头 月上柳梢头&#xff0c;人约黄昏后”是北宋学者欧阳修的名句&#xff0c;写的是与佳人相约的情景。请用天文学的观点赏析该名句&#xff0c;并进行如下的讨论&#xff1a;   1. 定义“月上柳梢头”时月亮在空中的角度和什么时间称为…

SOMEIP_ETS_177: SD_Unused_data_after_Options_Array_wrong_length

测试目的&#xff1a; 验证DUT能够正确处理单播SubscribeEventgroup请求&#xff0c;该请求在末尾包含未使用的有效载荷数据&#xff0c;且这些数据的长度不包括在SOME/IP长度字段中&#xff0c;并对此发送SubscribeEventgroupAck消息。 描述 本测试用例旨在确保DUT遵循SOME…