Java: Java8中stream Collectors.toMap将List转为Map

简介: Java: Java8中stream Collectors.toMap将List转为Map

作用:

  • Collectors.toMap将List转为Map

定义

public final class Collectors {
    public static <T, K, U>
    Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
                                    Function<? super T, ? extends U> valueMapper) {
        return toMap(keyMapper, valueMapper, throwingMerger(), HashMap::new);
    }
    public static <T, K, U>
    Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
                                    Function<? super T, ? extends U> valueMapper,
                                    BinaryOperator<U> mergeFunction) {
        return toMap(keyMapper, valueMapper, mergeFunction, HashMap::new);
    }
    public static <T, K, U, M extends Map<K, U>>
    Collector<T, ?, M> toMap(Function<? super T, ? extends K> keyMapper,
                                Function<? super T, ? extends U> valueMapper,
                                BinaryOperator<U> mergeFunction,
                                Supplier<M> mapSupplier) {
        BiConsumer<M, T> accumulator
                = (map, element) -> map.merge(keyMapper.apply(element),
                                              valueMapper.apply(element), mergeFunction);
        return new CollectorImpl<>(mapSupplier, accumulator, mapMerger(mergeFunction), CH_ID);
    }
}

使用示例

定义 User类

package com.github.mouday.demo;
public class User {
    private Integer id;
    private String name;
    private Integer age;
    public User(Integer id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

toMap 使用示例

package com.github.mouday.demo;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
public class Demo {
    public static void main(String[] args) {
        List<User> users = Arrays.asList(
                new User(1, "Tom", 20),
                new User(2, "Jack", 30),
                new User(3, "Steve", 40)
        );
        // id作为key, user对象作为value
        // Function.identity() 等价于 t -> t
        Map<Integer, User> collect = users.stream()
                .collect(Collectors.toMap(User::getId, Function.identity()));
        System.out.println(collect);
        // {
        //    1=User{id=1, name='Tom', age=20},
        //    2=User{id=2, name='Jack', age=30},
        //    3=User{id=3, name='Steve', age=40}
        // }
        // id作为key, name作为value
        Map<Integer, String> collect1 = users.stream()
                .collect(Collectors.toMap(User::getId, User::getName));
        System.out.println(collect1);
        // {1=Tom, 2=Jack, 3=Steve}
    }
}

如果key重复,会报错

Exception in thread "main" java.lang.IllegalStateException: 
Duplicate key User{id=1, name='Tom', age=20}

如果key键重复,我们取后者

package com.github.mouday.reggie;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
public class Demo {
    public static void main(String[] args) {
        List<User> users = Arrays.asList(
                new User(1, "Tom", 20),
                new User(2, "Jack", 30),
                new User(3, "Steve", 40),
                new User(1, "Judi", 50)
        );
        // id作为key, user对象作为value
        // Function.identity() 等价于 t -> t
        Map<Integer, User> collect = users.stream()
                .collect(Collectors.toMap(User::getId, Function.identity(), (n1, n2) -> n2));
        System.out.println(collect);
        // {
        // 1=User{id=1, name='Judi', age=50},
        // 2=User{id=2, name='Jack', age=30},
        // 3=User{id=3, name='Steve', age=40}
        // }
        // id作为key, name作为value
        Map<Integer, String> collect1 = users.stream()
                .collect(Collectors.toMap(User::getId, User::getName, (n1, n2) -> n2));
        System.out.println(collect1);
        // {1=Judi, 2=Jack, 3=Steve}
    }
}


目录
打赏
0
0
0
0
81
分享
相关文章
Java 8 新特性之 Stream API:函数式编程风格的数据处理范式
Java 8 引入的 Stream API 提供了一种新的数据处理方式,支持函数式编程风格,能够高效、简洁地处理集合数据,实现过滤、映射、聚合等操作。
114 6
Java中的Lambda表达式与Stream API的协同作用
在本文中,我们将探讨Java 8引入的Lambda表达式和Stream API如何改变我们处理集合和数组的方式。Lambda表达式提供了一种简洁的方法来表达代码块,而Stream API则允许我们对数据流进行高级操作,如过滤、映射和归约。通过结合使用这两种技术,我们可以以声明式的方式编写更简洁、更易于理解和维护的代码。本文将介绍Lambda表达式和Stream API的基本概念,并通过示例展示它们在实际项目中的应用。
Java Stream 使用指南
本文介绍了Java中Stream流的使用方法,包括如何创建Stream流、中间操作(如map、filter、sorted等)和终结操作(如collect、forEach等)。此外,还讲解了并行流的概念及其可能带来的线程安全问题,并给出了示例代码。
191 0
|
4月前
|
Java交换map的key和value值
通过本文介绍的几种方法,可以在Java中实现Map键值对的交换。每种方法都有其优缺点,具体选择哪种方法应根据实际需求和场景决定。对于简单的键值对交换,可以使用简单遍历法或Java 8的Stream API;对于需要处理值不唯一的情况,可以使用集合存储或Guava的Multimap。希望本文对您理解和实现Java中的Map键值对交换有所帮助。
77 1
探索Java中的Lambda表达式与Stream API
【10月更文挑战第22天】 在Java编程中,Lambda表达式和Stream API是两个强大的功能,它们极大地简化了代码的编写和提高了开发效率。本文将深入探讨这两个概念的基本用法、优势以及在实际项目中的应用案例,帮助读者更好地理解和运用这些现代Java特性。
|
4月前
|
Java中的Lambda表达式与Stream API的高效结合####
探索Java编程中Lambda表达式与Stream API如何携手并进,提升数据处理效率,实现代码简洁性与功能性的双重飞跃。 ####
49 0
|
5月前
|
优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。
【10月更文挑战第19天】本文介绍了如何优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。内容包括Map的初始化、使用Stream API处理Map、利用merge方法、使用ComputeIfAbsent和ComputeIfPresent,以及Map的默认方法。这些技巧不仅提高了代码的可读性和维护性,还提升了开发效率。
181 3
|
5月前
|
详细解析HashMap、TreeMap、LinkedHashMap等实现类,帮助您更好地理解和应用Java Map。
【10月更文挑战第19天】深入剖析Java Map:不仅是高效存储键值对的数据结构,更是展现设计艺术的典范。本文从基本概念、设计艺术和使用技巧三个方面,详细解析HashMap、TreeMap、LinkedHashMap等实现类,帮助您更好地理解和应用Java Map。
103 3
在Java的Map家族中,HashMap和TreeMap各具特色
【10月更文挑战第19天】在Java的Map家族中,HashMap和TreeMap各具特色。HashMap基于哈希表实现,提供O(1)时间复杂度的高效操作,适合性能要求高的场景;TreeMap基于红黑树,提供O(log n)时间复杂度的有序操作,适合需要排序和范围查询的场景。两者在不同需求下各有优势,选择时需根据具体应用场景权衡。
57 2
Java Map新玩法:深入探讨HashMap和TreeMap的高级特性
【10月更文挑战第19天】Java Map新玩法:深入探讨HashMap和TreeMap的高级特性,包括初始容量与加载因子的优化、高效的遍历方法、线程安全性处理以及TreeMap的自然排序、自定义排序、范围查询等功能,助你提升代码性能与灵活性。
46 2

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等