使用 Map 汇总 List 中重复元素的数值

使用 map 汇总 list 中重复元素的数值

本文介绍了如何使用 Java 中的 Map 数据结构来高效地汇总 List 中重复元素的数值。通过将元素的类型作为键,数值信息作为值存储在 Map 中,可以避免不必要的循环和比较,从而实现更简洁、高效的代码。文章提供了代码示例,展示了如何使用 compute 方法和 Stream API 的 toMap 方法来实现这一目标。

在处理包含重复元素的 List 时,如果需要汇总重复元素的数值信息,传统的循环遍历和比较方法效率较低,且代码可读性差。使用 Map 数据结构可以有效地解决这个问题。Map 是一种键值对存储结构,可以保证每个键的唯一性。因此,可以将 List 中元素的类型作为键,将需要汇总的数值信息(如金额和数量)作为值存储在 Map 中。

以下将介绍两种使用 Map 来汇总 List 中重复元素数值的方法:

1. 使用 compute 方法

compute 方法是 Map 接口提供的一个非常有用的方法,它允许我们根据键来计算新的值,并将新值更新到 Map 中。如果键不存在,则 compute 方法会创建一个新的键值对;如果键存在,则 compute 方法会使用给定的函数来计算新的值。

假设我们有如下的数据结构:

record Data(String type, Double amount, Integer quantity) {}record Datav2(Double amount, Integer quantity) {}

我们可以使用以下代码将 Data 对象存储到 Map 中,并使用 compute 方法来汇总相同类型的数据:

import java.util.HashMap;import java.util.Map;public class AccumulateValues {    public static void main(String[] args) {        var map = new HashMap(Map.of("A", new Datav2(2.0, 3)));        // add element to map equivalent to Data("A", 3.0, 3)        map.compute("A", (k, v) -> {            if (v == null) {                v = new Datav2(0.0, 0);            }            return new Datav2(3.0, v.quantity() + 3);        });        System.out.println(map); // Output: {A=Datav2[amount=3.0, quantity=6]}    }}

在这个例子中,我们首先创建了一个包含一个键值对的 HashMap。然后,我们使用 compute 方法来添加一个新的元素,其类型为 “A”,金额为 3.0,数量为 3。compute 方法首先检查 Map 中是否已经存在键 “A”。由于键 “A” 已经存在,因此 compute 方法会使用给定的 lambda 表达式来计算新的值。lambda 表达式将现有值(Datav2(2.0, 3))的金额加上 3.0,数量加上 3,然后返回一个新的 Datav2 对象。最后,compute 方法将 Map 中键 “A” 的值更新为新的 Datav2 对象。

2. 使用 Stream API 的 toMap 方法

如果数据最初存储在 List 中,可以使用 Java 8 引入的 Stream API 将 List 转换为 Map,并同时进行数值汇总。toMap 方法允许我们指定键和值的映射函数,以及当多个元素具有相同键时如何合并值的合并函数。

import java.util.List;import java.util.stream.Collectors;import java.util.Map;record Data(String type, Double amount, Integer quantity) {}record Datav2(Double amount, Integer quantity) {}public class AccumulateValuesStream {    public static void main(String[] args) {        var list = List.of(new Data("A", 2.0, 3),                new Data("A", 3.0, 3),                new Data("C", 2.0, 1),                new Data("B", 10.0, 3),                new Data("B", 2.0, 5)        );        var collected = list                .stream()                .collect(Collectors.toMap(                        // what will the key be                        Data::type,                        // what will the value be                        data -> new Datav2(data.amount(), data.quantity()),                        // how do we combine two values if they have the same key                        (d1, d2) -> new Datav2(d1.amount() + d2.amount(), d1.quantity() + d2.quantity())                ));        System.out.println(collected);    }}

在这个例子中,我们首先创建了一个包含多个 Data 对象的 List。然后,我们使用 stream() 方法将 List 转换为 Stream。接下来,我们使用 collect() 方法和 Collectors.toMap() 方法将 Stream 转换为 Map。toMap() 方法的第一个参数是一个函数,用于将 Data 对象转换为键。在这个例子中,我们将 Data 对象的 type 属性作为键。toMap() 方法的第二个参数是一个函数,用于将 Data 对象转换为值。在这个例子中,我们将 Data 对象的 amount 和 quantity 属性封装成一个 Datav2 对象作为值。toMap() 方法的第三个参数是一个函数,用于合并具有相同键的两个值。在这个例子中,我们将两个 Datav2 对象的 amount 和 quantity 属性分别相加,然后返回一个新的 Datav2 对象。

注意事项和总结

使用 Map 可以有效地避免不必要的循环和比较,提高代码效率。compute 方法适用于在已有 Map 的基础上添加或更新元素的情况。Stream API 的 toMap 方法适用于将 List 转换为 Map 并进行数值汇总的情况。在选择使用哪种方法时,应根据实际情况进行考虑。如果数据最初存储在 List 中,并且需要进行数值汇总,则可以使用 Stream API 的 toMap 方法。如果需要在已有 Map 的基础上添加或更新元素,则可以使用 compute 方法。在实际应用中,可以根据需要自定义数据结构和合并函数。

通过合理利用 Map 数据结构和相关方法,可以简化代码,提高效率,并使代码更具可读性和可维护性。

以上就是使用 Map 汇总 List 中重复元素的数值的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/99511.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月20日 16:46:04
下一篇 2025年11月20日 17:25:45

相关推荐

  • C++ 函数重载在大型软件开发中的应用

    函数重载允许在大型软件开发中使用相同名称创建不同参数的函数。优点包括:提高代码可读性,清晰地描述不同函数的功能。提高代码可维护性,易于添加或修改新类型的数据。减少代码冗余,避免重复实现相同功能。 C++ 函数重载在大型软件开发中的应用 引言 函数重载是 C++ 中一项强大的特性,它允许我们创建具有相…

    2025年12月18日
    000
  • 理解 C++ 函数中的引用传递与指针传递

    c++++ 函数中的参数传递:引用传递:使用变量别名,函数内部对参数的修改会反映到原始变量,优点是高效、可修改原始变量,缺点是必须提供有效引用且无法指向其他变量。指针传递:通过传递变量地址,函数内部可通过地址访问原始变量进行修改,优点是可以修改原始变量、指向其他变量,缺点是效率较低、语法复杂、可能出…

    2025年12月18日
    000
  • C++ 函数中引用和指针传递对代码可读性的影响

    c++++ 函数参数传递方式影响代码可读性:引用传递:优点:提升可读性,避免不必要的复制,明确表示函数将修改传入对象。指针传递:优点:允许空值传递、动态内存分配、灵活修改指针值。 C++ 函数中引用和指针传递对代码可读性的影响 在 C++ 中,函数参数可以按值、按引用或按指针传递。这三种传递方式将对…

    2025年12月18日
    000
  • C++ Lambda 表达式在测试驱动开发中的应用

    在测试驱动开发中,c++++ lambda 表达式允许定义匿名函数,从而简化测试用例编写:语法:[capture_list](parameters) -> return_type { body }实战案例:使用 lambda 表达式简化比较测试用例。优点:提高代码可读性、重用性和可维护性。注意…

    2025年12月18日
    000
  • C++ 函数参数命名约定:提升代码可读性和可维护性

    c++++ 函数参数命名约定有助于提高代码的可读性、可维护性和可重用性,包括:使用有意义且简洁的名称,避免模糊或通用的名称。采用驼峰命名法,多个单词以首字母大写,其余小写。使用适当的类型后缀来表明参数类型。尽量避免缩写,使用全称以防混淆。提供有意义的默认值,简化调用代码。 C++ 函数参数命名约定:…

    2025年12月18日
    000
  • C++ Lambda 表达式:释放匿名函数的潜力

    c++++ lambda 表达式允许创建和执行匿名函数,提高代码可读性和灵活性。其语法包括:捕获列表:指定 lambda 可访问的外部变量。参数列表:lambda 接收的参数。返回类型:lambda 的返回类型(可选)。函数体:lambda 要执行的代码。 C++ Lambda 表达式:释放匿名函数…

    2025年12月18日
    000
  • C++ 函数 Lambda 表达式:提升代码可读性

    lambda 表达式是一种创建匿名函数的方法,可通过 [capture list](parameters) -> return type { function body } 语法声明。它们提高了代码的可读性,通过捕获外部变量提供了灵活性,并通过替代独立函数简化了代码。最佳实践包括保持简洁、避免…

    2025年12月18日
    000
  • C++ 如何处理返回类型的类型转换

    在 c++++ 中,使用类型转换处理返回类型的类型转换:使用一对括号,括号内指定目标类型,后跟要转换的表达式。强制转换可能导致数据丢失或精度损失,因此在选择类型转换时应考虑兼容性、数据丢失可能性以及代码的可读性。 C++ 中如何处理返回类型的类型转换 类型转换在 C++ 中通常用于将表达式的值从一种…

    2025年12月18日
    000
  • C++ 函数返回类型指定技巧与注意事项

    在 c++++ 中,始终指定函数的返回类型至关重要,以优化性能、防止错误和提高可读性。技巧包括:使用合适的类型、避免返回 void、使用合适的返回类型修饰符、考虑默认返回值。实战案例:gcd 函数计算两个整数的最大公约数,并返回无符号整数。 C++ 函数返回类型指定技巧与注意事项 在 C++ 中,始…

    2025年12月18日
    000
  • C++ 函数的 Lambda 表达式:快速入门指南

    c++++中的lambda表达式lambda表达式是一种匿名函数,用于轻松便捷地定义和使用内联代码块。它们可以捕获外部变量,有三种捕获类型:按引用捕获所有([&])、按值捕获所有([=])和单独指定捕获变量。lambda表达式具有简洁性、灵活性、可读性等优点,但需要考虑其作用域限制和访问约束…

    2025年12月18日
    000
  • C++ 函数参数注释:文档化参数用途和约束

    c++++ 函数参数注释用于文档化参数用途和约束。通过使用 using 声明和 type alias,注释提供有关参数用途和约束的宝贵信息。这些注释可增强代码的可读性和理解性,减少猜测,提高文档化水平,并帮助避免错误,最佳实践是注释所有函数参数。 C++ 函数参数注释:文档化参数用途和约束 函数参数…

    2025年12月18日
    000
  • C++ 函数的泛型编程:最佳实践和案例研究?

    泛型编程是 c++++ 中利用模板和 sfinae 技术编写通用且可重用的函数的方法。最佳实践包括:使用 c++ 模板定义代码,使其不依赖于特定数据类型。使用 sfinae 实施类型检查和选择性泛型行为。考虑代码效率,优化编译时间和运行时性能。 C++ 函数的泛型编程:最佳实践与实战 泛型编程是 C…

    2025年12月18日
    000
  • 利用 C++ 函数增强通信系统性能

    通过利用 c++++ 函数,可以提升通信系统性能,具体优势包括:重复使用代码,避免重复编写;模块化,提高代码可读性和可维护性;可测试性,简化调试过程。 利用 C++ 函数增强通信系统性能 在现代通信系统中,性能和效率至关重要。通过利用 C++ 强大的函数功能,开发人员可以创建优化且高效的代码,从而显…

    2025年12月18日
    000
  • C++ 函数的陷阱:引用和指针的正确使用

    引用和指针是 c++++ 函数中常见的陷阱。引用是变量的别名,指针是变量地址的存储。陷阱包括引用悬垂(引用的变量不在有效)、常引用(const 引用指向的变量不能被修改)和野指针(指针指向已销毁的变量)。最佳实践包括始终初始化引用和指针、避免引用悬垂和野指针,以及谨慎使用可变引用。 C++ 函数的陷…

    2025年12月18日
    000
  • Pointers and Lambdas: A Journey through C++ Function Evolution

    指针和 lambda 表达式在 c++++ 中的演变之旅:指针:指针指向内存地址,允许访问和操作变量,提升数据结构灵活性和内存分配动态性。lambda 表达式:内联函数捕获作用域变量,简化函数定义并提高代码可读性。结合使用:指针与 lambda 结合可创建动态函数指针数组,提升函数灵活性。实战案例:…

    2025年12月18日
    000
  • C++ 泛型在函数扩展中的作用

    泛型在 c++++ 函数扩展中用于创建独立于类型的数据结构和算法,提高代码可读性、可重用性和灵活性。它通过尖括号 声明类型参数,例如:template void some_function(t value) {…}。泛型函数的优点包括代码复用、可读性增强以及添加新类型时的灵活性。然而,泛…

    2025年12月18日
    000
  • C++ 函数的未来展望:最佳实践如何帮助开发人员避免常见错误?

    遵循 c++++ 函数最佳实践能避免常见错误,包括:始终对参数和返回值进行类型标注,提高代码可读性。使用智能指针管理内存,防止内存泄漏。慎用宏,仅在必要时使用。保持函数简短,分解复杂任务。使用异常处理处理错误,提高代码可维护性。 C++ 函数的未来展望:最佳实践如何帮助开发人员避免常见错误 引言 C…

    2025年12月18日
    000
  • C++ 常量与枚举:提高代码可读性和安全性

    c++++ 中的常量和枚举通过使用 const 关键字和 enum 数据类型提升代码的可读性、可维护性和安全性。它们允许开发人员使用有意义的名称来表示特定的值,从而提高代码的可理解性;通过集中管理值,提高了可维护性;并防止意外修改数据,增强了安全性。 C++ 常量与枚举:提升代码可读性、可维护性和安…

    2025年12月18日
    000
  • C++ 函数的最佳实践:优化性能,提升代码可读性

    c++++ 函数最佳实践包括:保持函数简短并使用有意义的名称;通过使用常量引用和避免不必要的复制来优化性能;遵循单一职责原则,只在一个函数中处理一项任务。例如,计算整数数组平均值的函数可以优化为:int average(const int (&)arr, int& n),使用常量引用…

    2025年12月18日
    000
  • C++ 函数的未来展望:最佳实践如何帮助开发人员提高代码效率?

    c++++ 函数最佳实践提升代码效率:遵循单一职责原则,每个函数仅执行单一任务。指定正确的函数签名(参数类型、返回值类型、函数名)。根据需要通过值或引用传递参数,优化函数调用。利用 constexpr 关键字,优化编译时常量计算。编写可读的函数(有意义的名称、注释、格式)。这些最佳实践可提高代码效率…

    2025年12月18日
    000

发表回复

登录后才能评论
关注微信