【Java基础】使用Java 8的Stream API来简化Map集合的操作

2023-11-10

在 Java 8 中引入的 Stream API 是一种非常强大的函数式编程工具,可以帮助开发者更加方便地对集合进行操作和处理。而在 Map 集合中,Stream API 的使用也能够极大地简化代码,并提升程序效率和可读性。在本文中,我们将介绍如何使用 Java 8 的 Stream API 来优雅地对 Map 集合进行操作。


1. 将 Map 转换为流

在 Java 8 中,Map 提供了 entrySet 方法用于将其转换为 Set<Map.Entry<K, V>> 对象。我们可以利用这个方法来将 Map 转换为 Stream 流对象。示例代码如下:

Map<String, Integer> map = new HashMap<>();
map.put("a", 1);
map.put("b", 2);
map.put("c", 3);
Stream<Map.Entry<String, Integer>> stream = map.entrySet().stream();

在这个例子中,我们先创建了一个包含三个键值对的 Map 对象。接着,我们使用 entrySet 方法获取 Map 中所有的键值对,并将其转换为 Stream 流对象。

2. 筛选满足条件的键值对

在 Stream API 中,我们可以使用 filter 方法来筛选出满足特定条件的元素。在 Map 中,我们经常需要根据 key 或者 value 来对键值对进行筛选。示例如下:

Map<String, Integer> map = new HashMap<>();
map.put("a", 1);
map.put("b", 2);
map.put("c", 3);
Map<String, Integer> filteredMap = map.entrySet().stream()
        .filter(entry -> entry.getKey().startsWith("a") || entry.getValue() == 3)
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
System.out.println(filteredMap); // 输出 {a=1, c=3}

在这个例子中,我们先创建了一个包含三个键值对的 Map 对象。然后,我们使用 Stream API 的 filter 方法来筛选出 key 以 "a" 开头或者 value 等于 3 的键值对,并将其转换为新的 Map 集合。

3. 对值进行转换和映射

在 Map 中,我们经常需要对 value 进行各种操作和处理,例如求和、平均值、最大值、最小值等。在 Stream API 中,我们可以使用 map 方法对集合中的元素进行转换和映射。示例如下:

Map<String, Integer> map = new HashMap<>();
map.put("a", 1);
map.put("b", 2);
map.put("c", 3);
int sum = map.values().stream().mapToInt(Integer::intValue).sum();
double average = map.values().stream().mapToInt(Integer::intValue).average().orElse(0);
int max = map.values().stream().mapToInt(Integer::intValue).max().orElse(0);
int min = map.values().stream().mapToInt(Integer::intValue).min().orElse(0);
System.out.println(sum); // 输出 6
System.out.println(average); // 输出 2.0
System.out.println(max); // 输出 3
System.out.println(min); // 输出 1

在这个例子中,我们先创建了一个包含三个键值对的 Map 对象。接着,我们使用 Stream API 的 mapToInt 方法将 Map 中所有的 value 转换为 int 类型,并进行求和、平均值、最大值、最小值等操作。

4. 将键值对转换为其他类型对象

在 Map 集合中,我们经常需要将键值对转换为其他类型的对象,例如 DTO、POJO 等。在 Stream API 中,我们可以使用 map 方法来实现这个功能。示例如下:

Map<String, Integer> map = new HashMap<>();
map.put("a", 1);
map.put("b", 2);
map.put("c", 3);
List<DemoDTO> dtos = map.entrySet().stream()
        .map(entry -> new DemoDTO(entry.getKey(), entry.getValue()))
        .collect(Collectors.toList());
System.out.println(dt);

在这个例子中,我们先创建了一个包含三个键值对的 Map 对象。然后,我们使用 Stream API 的 map 方法将键值对转换为 DemoDTO 对象,并将其收集到一个 List 集合中。

5. 将键或值转换为其他类型对象

除了将整个键值对转换为其他类型对象外,有时候我们也需要将键或者值转换为其他类型的对象。在 Stream API 中,我们可以使用 map 方法来实现这个功能。示例如下:

Map<String, Integer> map = new HashMap<>();
map.put("a", 1);
map.put("b", 2);
map.put("c", 3);
List<String> keys = map.keySet().stream().map(String::toUpperCase).collect(Collectors.toList());
List<Double> values = map.values().stream().map(Integer::doubleValue).collect(Collectors.toList());
System.out.println(keys); // 输出 [A, B, C]
System.out.println(values); // 输出 [1.0, 2.0, 3.0]

在这个例子中,我们先创建了一个包含三个键值对的 Map 对象。然后,我们使用 Stream API 的 map 方法将其 key 转换为大写字母,并将其 value 转换为 double 类型。最终,我们将转换后的结果分别收集到两个不同的 List 集合中。

6. 对键值对进行排序

在 Map 集合中,我们经常需要根据 key 或者 value 来对键值对进行排序。在 Stream API 中,我们可以使用 sorted 方法来实现这个功能。示例如下:

Map<String, Integer> map = new HashMap<>();
map.put("b", 2);
map.put("a", 1);
map.put("c", 3);
Map<String, Integer> sortedMapByKey = map.entrySet().stream()
        .sorted(Map.Entry.comparingByKey())
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
Map<String, Integer> sortedMapByValue = map.entrySet().stream()
        .sorted(Map.Entry.comparingByValue())
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
System.out.println(sortedMapByKey); // 输出 {a=1, b=2, c=3}
System.out.println(sortedMapByValue); // 输出 {a=1, b=2, c=3}

在这个例子中,我们先创建了一个包含三个键值对的 Map 对象。接着,我们使用 Stream API 的 sorted 方法分别按照 key 和 value 进行排序,并将其转换为新的 Map 集合。


总结

Java 8 的 Stream API 在操作和处理 Map 集合时提供了非常强大和便利的工具。通过将 Map 转换为流对象,可以使用 filter、map、collect 等方法对键值对进行筛选、转换、收集等各种操作。同时,也可以根据需要对键或者值进行单独的转换和映射,以及对键值对进行排序等操作。这些功能不仅提高了代码的简洁性和可读性,也为我们的开发工作带来了更高的效率和可维护性。

总之,Stream API 是 Java 8 中非常强大和实用的一项新特性,可以帮助开发者更加简洁、高效地处理各种集合类型。在实际应用中,我们可以根据具体需求灵活选用不同的方法和技巧,以便更好地利用和发挥 Stream API 的优势和功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Java基础】使用Java 8的Stream API来简化Map集合的操作 的相关文章

  • 在 Java 中捕获(捕获)窗口中的鼠标光标

    我正在寻找一种方法 在鼠标进入窗口后捕获或捕获该窗口中的鼠标 就像鼠标被捕获在虚拟机窗口中一样 直到用户按 CTRL ALT DEL 或以其他方式释放鼠标 我如何在 Java 中实现这一点 全屏显示不是一个选择 EDIT 这里有一些 SSC
  • 了解 netty 通道缓冲区和水印

    我正在尝试了解网络缓冲区和水印 作为一个测试用例 我有一个 netty 服务器 它向客户端写入数据 客户端被阻止 基本上每次读取之间有 10 秒的睡眠时间 在正常 I O 下 如果接收方被阻塞 TCP 发送方将受到限制 由于流量控制 发送速
  • 如何在 Android 中的 Chrome 或 Firefox 等特定浏览器的 Web 视图中加载应用程序

    我是 Android 新手 我正在做一个应用程序 我需要在平板电脑上的 Web 视图中加载现有的应用程序 在平板电脑中 当我使用 Web 视图加载应用程序时 我的应用程序将加载到默认浏览器中 如何在平板电脑上的 Web 视图中的特定浏览器
  • Hashset - 创建 Set 后使对象相同

    如果我们在 HashSet 中添加两个不同的对象 可变的 然后通过调用 setter 更改对象的值 使它们相同 则大小仍然是 hashSet 的 2 我无法理解其原因 public static void main String args
  • 垂直 ViewPager 中的动画

    我需要垂直制作这个动画ViewPager https www youtube com watch v wuE 4jjnp3g https www youtube com watch v wuE 4jjnp3g 这是我到目前为止所尝试的 vi
  • 如何从 Java 访问 Windows 设备管理器中的信息?

    我有一个串行 USB 设备 并且其中多个设备可以连接到计算机 我需要查询和检索设备连接到的 COM 端口列表 在 Windows 设备管理器中 您可以获得当前连接的设备的 COM 端口 友好名称 该列表是动态的 从注册表中读取不工作 htt
  • Selenium 和 TestNG 同时使用“dependsOn”和“priority =”问题

    我正在努力在 GUI 自动化测试中实现更好的工作流程控制 我首先从dependsOn开始 但很快发现缺点是如果一个测试失败 则套件的整个其余部分都不会运行 所以我改用 priority 但看到了意外的行为 一个例子 Test priorit
  • 绘制平滑曲线

    我想创建更平滑的曲线 而不仅仅是线角 这是我现在画的图 这是我的代码 case FREEHAND float pts float ptk ptk new float 2 imageMatrix invert inv if mCurrentS
  • RxJava android mvp 单元测试 NullPointerException

    我是 mvp 单元测试的新手 我想对演示者进行一个非常基本的测试 它负责登录 我只想断言 view onLoginSuccess 这是演示者代码 public LoginPresenter LoginViewContract loginVi
  • ActiveMQ JNDI 查找问题

    尝试使用 JNDI 运行以下 ActiveMQ http activemq apache org jndi support html http ActiveMQ 20JNDI 并且我的 jboss server node lib 文件夹中有
  • 错误膨胀类 android.support.design.widget.NavigationView [启动时崩溃]

    该应用程序应该有一个导航抽屉 可以从左侧拉出并显示各种活动 但是一旦将导航栏添加到 XML Activity homescreen 文档中 应用程序一启动就会崩溃 主屏幕 java package com t99sdevelopment c
  • 接口是否像对象一样对待?

    为什么下面的代码可以工作 interface I class A implements I public String toString return in a class B extends A public String toStrin
  • Janusgraph 0.3.2 + HBase 1.4.9 - 无法设置 graph.timestamps

    我在 Docker 容器中运行 Janusgraph 0 3 2 并尝试使用运行 HBase 1 4 9 的 AWS EMR 集群作为存储后端 我可以运行 gremlin server sh 但如果我尝试保存某些内容 我会得到粘贴在下面的堆
  • Java 8 方法签名不一致

    Java 8 为我们提供了具有很长签名的新方法 如下所示 static
  • 无法连接到docker中的elasticsearch容器

    我正在尝试使用 docker 的官方 elasticsearch 镜像 我遵循了本指南 https www elastic co guide en elasticsearch reference current docker html但是当
  • java.lang.UnsatisfiedLinkError - android studio gradle 中的 NDK?

    文件夹结构 app main java jni Android mk Application mk hello jni c res 在构建 gradle apply plugin com android application androi
  • 使用 Java 8 Spring 4 + MyBatis 集成问题

    使用 Java 8 1 8 0 60 Spring 4 2 1 和 MyBatis 3 3 0 时遇到以下异常 Sep 29 2015 11 02 58 AM org springframework context annotation A
  • java Web应用程序中的日期转换

    String date1 13 03 2014 16 56 46 AEDT SimpleDateFormat sdf new SimpleDateFormat dd MM yyyy HH mm ss z sdf setTimeZone Ti
  • Java时区混乱

    我正在运行 Tomcat 应用程序 并且需要显示一些时间值 不幸的是 时间快到了 还有一个小时的休息时间 我调查了一下 发现我的默认时区被设置为 sun util calendar ZoneInfo id GMT 08 00 offset
  • 我怎样才能限定我不“拥有”的自动装配设置器

    要点是 Spring Batch v2 测试框架具有JobLauncherTestUtils setJob与 Autowired注解 我们的测试套件有多个Job类提供者 由于这个类不是我可以修改的东西 我不确定如何限定它自动连接的作业 每个

随机推荐

  • Python中使用input()无输入

    Python中使用input 无输入 sublime Text编译器因页面美观 插件众多 功能强大深受编程爱好者的青睐 然而在编程中由于插件忘记安装导致程序运行失败 使人颇为烦恼 问题描述 在sublime Text编译器中使用input
  • Git 如何压缩 commit

    今天同事突然问我 由于在给老大的开源项目提 pr 的时候 自己比较长时间没有 rebase 的老大的项目 master 分支了 而自己提交的 commit 又很多 有些 commit 又是实验性质的 乱七八糟的 其实就是没有用熟 git 还
  • Java工作流框架:探索流程引擎的实现和应用

    目前 市面上有很多基于SpringBoot Vue前后端分离的Java快速开发框架和工作流开发框架可供选择 以下是一些比较流行的框架 1 Spring Cloud Spring Cloud是一套基于Spring Boot的开发工具 用于快速
  • sqli-labs Less18 原理到实现详解

    目录 前期知识储备 一 初始思路 1 思路 2 user agent后加入 发现出现sql错误日志 3 我尝试了之前用的各种闭合方法 都已失败告终 4 新的问题 5 现在想的是如何利用mysql插入语句insert实现注入 前期知识储备 从
  • 【Qt styleSheet样式表】

    一 Qt styleSheet样式表语法 1 属性列表 下表列出了 Qt 样式表支持的所有属性 可以为属性赋予哪些值取决于属性类型 除非另有说明 否则以下属性适用于所有小部件 标有星号 的属性为Qt特定的 在 CSS2 或 CSS3 中没有
  • Python+PySide2:使用多线程处理界面卡死的情况

    本篇主要是梳理一下 在使用 Pyside2 模块的时候 利用多线程处理页面假死 exe未响应 的问题 一 这边举个例子吧 如下图所示 测试代码如下 class Stats def init self 从文件中加载UI定义 super ini
  • 32位 与64位编译

    为了适应现在越来越流行的64位系统 经常需要将代码分别编译为32位版和64位版 其次 除了需要生成debug版用于开发测试外 还需要生成release版用于发布 本文介绍了如何利用makefile条件编译来生成这些版本 而且不仅兼容Linu
  • 1、python调用java的jar包

    在python中调用jar包 最近的项目功能需要调用客户的java接口 在调用接口的时候需要使用配套的jar包生成一些参数 但是公司的项目是用django搭建的 经过无数血与泪的尝试 最终终于找到了合适的方法去调用 jpype包是一个Pyt
  • 解决dubbo问题:forbid consumer

    原文地址 http www jameswxx com e4 b8 ad e9 97 b4 e4 bb b6 e8 a7 a3 e5 86 b3dubbo e9 97 ae e9 a2 98 ef bc 9aforbid consumer 线
  • Win10环境python3.7安装dlib模块

    自己按照别人的博客安装了一下dlib 测试成功 在这里自己也稍微总结一下 博客原文 https blog csdn net zhang475546259 article details 84104368 1 安装VS201x 全称visua
  • 简单支付验证-SPV

    SPV的来源 在比特币整个生态圈里 大部分都是普通用户 即只有基本的比特币投资及消费支付需要的用户 他们可能没有矿机 没有高端配置的电脑 那么他们是否也要运行一个全节点程序呢 要知道 现在官方显示的结果 比特币所有区块数据目前在120G左右
  • webstorm等JetBrains全家桶搜索任何插件都无反应

    使用webstorm搜索任何插件都无反应 打开webstorm设置 搜索settings或者是System Settings 找到HTTP Proxy 设置AUTO detect proxy settings后 点击右下角的Apply应用后
  • vue 中provide的用法_Vue中使用provide和inject

    相信大家在工作中一定遇到过多层嵌套组件 而vue 的组件数据通信方式又有很多种 比如vuex dollar parent与 dollar children prop dollar emit与 dollar on dollar attrs与
  • 为什么需要对数值类型的特征做归一化?

    为什么需要对数值类型的特征做归一化 1 举例子 比如分析一个人的身高和体重对健康的影响 身高的单位是m 范围是1 6 1 8 体重的单位是kg 在50kg 100kg之间 分析出的结果自然会倾向于数值差异较大的体重特征 因此我们需要数值归一
  • 新版Spring Boot(10)- Spring Boot 整合数据持久层(1)

    1 整合JdbcTemplate Service Description TODO Author tzb Date 2021 8 22 10 23 Version 1 0 Service public class UserService A
  • 【Mysql】删除表记录,并限制条数

    删除表数据 好删 那如果要限制条数 如何删除呢 例如 有个表tag list 我要删除aid为6666的前100条数据 sql如下 删除表记录limit限制条数 delete from tag list where aid 6666 lim
  • JUC 六. 线程中断 与 LockSupport

    目录 一 基础理解 如何退出一个线程 volatile 与 AtomicBoolean 中断线程示例 Thread中自带的中断api示例 阻塞状态线程中断时异常解决 二 Thread中自带的中断底层分析 三 总结 一 基础理解 先了解几个问
  • 打印九九口诀表(pta练习题)

    下面是一个完整的下三角九九口诀表 本题要求对任意给定的一位正整数N 输出从1 1到N N的部分口诀表 输入格式 输入在一行中给出一个正整数N 1 N 9 输出格式 输出下三角N N部分口诀表 其中等号右边数字占4位 左对齐 include
  • AIDL原理和相关文件解析

    Binder概述 相信从事Android相关的研发人员 都对Binder有个或多或少的了解 相关技术博客也有一大推 我今天对Binder的学习过程进行一个记录 理论性的叙述会少一点 更多的是基于AS自动生成的AIDL文件进行代码分析 但读者
  • 【Java基础】使用Java 8的Stream API来简化Map集合的操作

    在 Java 8 中引入的 Stream API 是一种非常强大的函数式编程工具 可以帮助开发者更加方便地对集合进行操作和处理 而在 Map 集合中 Stream API 的使用也能够极大地简化代码 并提升程序效率和可读性 在本文中 我们将