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

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

在 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 的优势和功能。


http://www.kler.cn/a/14669.html

相关文章:

  • 【LeetCode: 5. 最长回文子串 | 暴力递归=>记忆化搜索=>动态规划 => 中心扩展法】
  • C/C++占位符,%x和%p的区别
  • 和chatgpt学习javascript,第一天,学习背景知识
  • 电源电压监测(SVD)
  • SpringBoot整合ELK做日志(超完整)
  • AR实战-基于Krpano的多场景融合及热点自定义
  • 基于Stackelberg博弈的光伏用户群优化定价模型(Matlab代码实现)
  • 什么是矩阵式项目管理?
  • Go | 一分钟掌握Go | 3 - 学习路线
  • 华为OD机试真题(Java),开元音统计(100%通过+复盘思路)
  • 介绍与评测Intel HLE与RTM技术
  • 如何用链表实现LRU缓存淘汰算法
  • 【android专题】学习android,第一天学习:软件和组件了解
  • AI | 浅谈AI技术以及其今后发展
  • 随机模型预测控制(SMPC)——考虑概率约束(Matlab代码实现)
  • 业内首批!安全狗入选Gartner《云原生应用保护平台市场指南》报告
  • 【小技巧】word文档编辑技巧(一)
  • SD卡恢复怎么做?内存卡数据恢复,3个方法!
  • 手把手教你安装telnet(离线方式+在线方式)
  • js特殊对象 - RegExp对象(正则表达式)