Java中List流式转换为Map的终极指南

哈喽,大家好,我是木头左!

在Java编程中,经常需要将一个List对象转换为另一个Map对象。这可能是因为需要根据List中的元素的某些属性来创建一个新的键值对集合。在本文中,我将向您展示如何使用Java 中的流式API轻松地实现这一目标。

1. 使用Collectors.toMap()方法

让了解一下如何使用Collectors.toMap()方法将List转换为Map。这个方法接受两个函数参数,一个是用于生成键的函数,另一个是用于生成值的函数。

假设有一个Person类,其中包含name和age属性:

java 复制代码
public class Person {
    private String name;
    private int age;

    // 构造函数、getter和setter省略...
}

现在,有一个包含Person对象的List,想要将其转换为一个Map,其中键是Person对象的名字,值是Person对象的年龄。可以使用以下代码实现这一点:

java 复制代码
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class ListToMapExample {
    public static void main(String[] args) {
        List<Person> personList = Arrays.asList(
                new Person("Alice", 30),
                new Person("Bob", 25),
                new Person("Cathy", 35)
        );

        Map<String, Integer> personMap = personList.stream()
                .collect(Collectors.toMap(Person::getName, Person::getAge));

        System.out.println(personMap); // 输出:{Alice=30, Bob=25, Cathy=35}
    }
}

在上面的代码中,使用了Person类的getName()和getAge()方法作为键和值生成函数。这样,Collectors.toMap()方法就可以根据Person对象的名字和年龄生成一个新的Map。

2. 处理重复键的情况

当使用Collectors.toMap()方法时,如果List中有多个具有相同键的元素,那么会抛出IllegalStateException异常。为了解决这个问题,可以提供一个合并函数,该函数用于处理具有相同键的元素。合并函数接受两个值作为参数,并返回一个合并后的值。

例如,假设有一个包含重复名字的Person对象列表,想要将它们转换为一个Map,其中键是Person对象的名字,值是Person对象的年龄。可以使用以下代码实现这一点:

java 复制代码
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collectors;

public class ListToMapExample {
    public static void main(String[] args) {
        List<Person> personList = Arrays.asList(
                new Person("Alice", 30),
                new Person("Bob", 25),
                new Person("Alice", 35)
        );

        Map<String, Integer> personMap = personList.stream()
                .collect(Collectors.toMap(Person::getName, Person::getAge, (oldValue, newValue) -> oldValue + newValue));

        System.out.println(personMap); // 输出:{Alice=65, Bob=25}
    }
}

在上面的代码中,提供了一个合并函数,该函数将两个年龄值相加。这样,当遇到具有相同名字的Person对象时,Collectors.toMap()方法就会使用合并函数来计算最终的年龄值。

我是木头左,感谢各位童鞋的点赞、收藏,我们下期更精彩!

相关推荐
Kuo-Teng2 分钟前
LeetCode 73: Set Matrix Zeroes
java·算法·leetcode·职场和发展
王元_SmallA5 分钟前
服务器公网IP、私网IP、弹性IP是什么?区别与应
java·后端
woshihonghonga6 分钟前
Deepseek在它擅长的AI数据处理领域还有是有低级错误【k折交叉验证中每折样本数计算】
人工智能·python·深度学习·机器学习
程序猿20236 分钟前
Python每日一练---第六天:罗马数字转整数
开发语言·python·算法
葵续浅笑25 分钟前
LeetCode - 杨辉三角 / 二叉树的最大深度
java·数据结构·算法·leetcode
程序员杰哥26 分钟前
Fiddler抓包手机和部分app无法连接网络问题
自动化测试·软件测试·python·测试工具·智能手机·fiddler·测试用例
装不满的克莱因瓶34 分钟前
【Java架构师】各个微服务之间有哪些调用方式?
java·开发语言·微服务·架构·dubbo·restful·springcloud
weixin_3077791336 分钟前
用Python和FastAPI构建一个完整的企业级AI Agent微服务脚手架
python·fastapi·web app
熊猫_豆豆39 分钟前
回调函数的作用与举例(Python版)
服务器·python·编程语法
N 年 后1 小时前
cursor和传统idea的区别是什么?
java·人工智能·intellij-idea