Java List 转 Map

Java List 转 Map

Java List 转 Map

Java 编程中,我们经常需要将一个 List 转换成 Map,以便更方便地进行快速查找、键值对存储等操作。本文将详细介绍如何实现 Java List 转 Map 的几种常用方法以及解释它们的优缺点。

一、Java 8 使用 Stream API

Java 8 引入了 Stream API,通过它可以更方便地操作集合。使用 Stream API,我们可以简洁地将 List 转换成 Map,这是一种简单且直观的方法,下面是一段示例代码:

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 = List.of(
                new Person("Alice", 25),
                new Person("Bob", 30),
                new Person("Catherine", 35)
        );

        // 将 List<Person> 转换为 Map<String, Person>,其中键为 name,值为 Person 对象
        Map<String, Person> personMap = personList.stream()
                .collect(Collectors.toMap(Person::getName, person -> person));

        // 打印输出 Map
        System.out.println(personMap);
    }
}

class Person {
    private String name;
    private int age;

    // 省略构造函数、getter和setter方法

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
Java

运行以上代码,我们会得到如下输出:

{Bob=Person{name='Bob', age=30}, Catherine=Person{name='Catherine', age=35}, Alice=Person{name='Alice', age=25}}
Java

上述代码中,我们使用了 personList.stream().collect(Collectors.toMap(Person::getName, person -> person)) 将 List 转换为 Map。Person::getName 表示以 Person 对象的 name 属性作为键,person -> person 表示将 Person 对象本身作为值。

值得注意的是,如果 List 中存在相同的键(这里是 name),则会抛出 java.lang.IllegalStateException 异常。如果我们希望在遇到重复键时,保留最后一个值,我们可以将上述代码中的 person -> person 修改为 (person1, person2) -> person2

除了使用 toMap 方法,Stream API 还提供了很多其他的方法来处理 List 转 Map 的需求,如 toConcurrentMaptoUnmodifiableMap 等。在具体应用场景中,你可以根据需求选择适合的方法。

二、使用 Apache Commons Collections 包

除了使用 Java 8 中的 Stream API,我们还可以利用 Apache Commons Collections 包来实现 List 转 Map 的功能。

Apache Commons Collections 是针对 Java 集合框架的一组扩展工具类库,提供了很多方便实用的集合操作方法。在使用之前,我们需要先引入 Apache Commons Collections 包。下面是一段示例代码:

import org.apache.commons.collections4.ListUtils;
import org.apache.commons.collections4.MapUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ListToMapExample {

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

        // 使用 ListUtils.transformedMap 方法将 List<Person> 转换为 Map<String, Person>
        Map<String, Person> personMap = MapUtils.transformedMap(
                ListUtils.listToMap(personList, Person::getName),
                Person::valueOf
        );

        // 打印输出 Map
        System.out.println(personMap);
    }
}

class Person {
    private String name;
    private int age;

    // 省略构造函数、getter和setter方法

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    // 定义 Person.valueOf 方法,用于接收 Person 对象的字符串形式,示例代码中用到了该方法
    public static Person valueOf(String str) {
        String[] parts = str.split(",");
        String name = parts[0].substring(7);
        int age = Integer.parseInt(parts[1].substring(5));
        return new Person(name, age);
    }
}
Java

运行以上代码,我们会得到如下输出:

{Bob=Person{name='Bob', age=30}, Catherine=Person{name='Catherine', age=35}, Alice=Person{name='Alice', age=25}}
Java

上述代码中,我们使用了 ListUtils.listToMap(personList, Person::getName) 将 List 转换为 Map,其中键为 name,值为 Person 对象字符串形式。

然后,我们通过 MapUtils.transformedMap 方法将上述的 Map 转换成我们期望的格式,即键为 name,值为 Person 对象。在 transformedMap 方法中,我们还调用了 Person::valueOf 方法,该方法用于将 Person 对象的字符串形式转换成 Person 对象。

Apache Commons Collections 提供了很多用于集合转换的方法,不仅可以用于 List 转 Map,还可以用于其他类似的转换操作。使用 Apache Commons Collections,可以简化 Java 编程中的集合操作,提高开发效率。

三、手动迭代实现

除了使用现有的工具类库,我们还可以手动使用迭代方式实现 List 转 Map。下面是一段示例代码:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ListToMapExample {

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

        // 手动迭代实现 List<Person> 转换为 Map<String, Person>
        Map<String, Person> personMap = new HashMap<>();
        for (Person person : personList) {
            personMap.put(person.getName(), person);
        }

        // 打印输出 Map
        System.out.println(personMap);
    }
}

class Person {
    private String name;
    private int age;

    // 省略构造函数、getter和setter方法

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
Java

运行以上代码,我们会得到如下输出:

{Bob=Person{name='Bob', age=30}, Catherine=Person{name='Catherine', age=35}, Alice=Person{name='Alice', age=25}}
Java

上述代码中,我们手动使用迭代方式实现了 List 转换为 Map。通过遍历 List 中的每个 Person 对象,将其名称作为键,Person 对象本身作为值,逐一存放到 Map 中。

尽管手动迭代实现简单,但需要编写更多的代码,并且不具备代码重用性。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册