Java8 - 将 List 集合转为 Map

这篇具有很好参考价值的文章主要介绍了Java8 - 将 List 集合转为 Map。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {

    private Integer userId;
    private String name;
    private String email;
}

1. 将List转为Map:key=userId, value=name

public class Main {
    public static void main(String[] args) {
        List<User> users = new ArrayList<>();
        users.add(new User(1, "user1", "email1@demo.com"));
        users.add(new User(2, "user2", "email2@demo.com"));
        users.add(new User(3, "user3", "email3@demo.com"));
        users.add(new User(4, "user4", "email4@demo.com"));

        Map<Integer, String> userIdAndName = users.stream().collect(Collectors.toMap(User::getUserId, User::getName));

        System.out.println(userIdAndName);
    }
}

输出:

{1=user1, 2=user2, 3=user3, 4=user4}

2. 将List转为Map:key=userId, value=User对象

public class Main {
    public static void main(String[] args) {
        List<User> users = new ArrayList<>();
        users.add(new User(1, "user1", "email1@demo.com"));
        users.add(new User(2, "user2", "email2@demo.com"));
        users.add(new User(3, "user3", "email3@demo.com"));
        users.add(new User(4, "user4", "email4@demo.com"));

        Map<Integer, User> userIdAndName = users.stream().collect(Collectors.toMap(User::getUserId, user->user));

        System.out.println(userIdAndName);
    }
}

输出:

{
    1=User(userId=1, name=user1, email=email1@demo.com), 
    2=User(userId=2, name=user2, email=email2@demo.com), 
    3=User(userId=3, name=user3, email=email3@demo.com), 
    4=User(userId=4, name=user4, email=email4@demo.com)
}

3. 重复的 key 处理

如果出现相同的key,那么会抛出重复key的异常,比如我们将userId为3的修改为2,则会和第二个用户冲突:

public class Main {
    public static void main(String[] args) {
        List<User> users = new ArrayList<>();
        users.add(new User(1, "user1", "email1@demo.com"));
        users.add(new User(2, "user2", "email2@demo.com"));
        users.add(new User(2, "user3", "email3@demo.com"));
        users.add(new User(4, "user4", "email4@demo.com"));

        Map<Integer, User> userIdAndName = users.stream().collect(Collectors.toMap(User::getUserId, user->user));

        System.out.println(userIdAndName);
    }
}

抛出异常:

Exception in thread "main" java.lang.IllegalStateException: Duplicate key User(userId=2, name=user2, email=email2@demo.com)
	at java.util.stream.Collectors.lambda$throwingMerger$113(Collectors.java:133)
	at java.util.stream.Collectors$$Lambda$3/780237624.apply(Unknown Source)
	at java.util.HashMap.merge(HashMap.java:1245)
	at java.util.stream.Collectors.lambda$toMap$171(Collectors.java:1320)
	at java.util.stream.Collectors$$Lambda$5/1560911714.accept(Unknown Source)
	at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
	at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1374)
	at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:512)
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:502)
	at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
	at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
	at com.imooc.uua.rest.Main.main(Main.java:16)

Collectors.toMap支持第三个参数,对重复值进行选取:

public class Main {
    public static void main(String[] args) {
        List<User> users = new ArrayList<>();
        users.add(new User(1, "user1", "email1@demo.com"));
        users.add(new User(2, "user2", "email2@demo.com"));
        users.add(new User(2, "user3", "email3@demo.com"));
        users.add(new User(4, "user4", "email4@demo.com"));

        Map<Integer, User> userIdAndName = users.stream().collect(Collectors.toMap(
                User::getUserId,
                user->user,
                (oldValue,newValue)->newValue));

        System.out.println(userIdAndName);
    }
}

输出:

{
     1=User(userId=1, name=user1, email=email1@demo.com), 
     2=User(userId=2, name=user3, email=email3@demo.com), 
     4=User(userId=4, name=user4, email=email4@demo.com)
}

可以看到,只会出现 user3,而 user2 被覆盖掉了

4. 将 id 和用户列表映射:groupingBy

刚才上面出现重复的ID,是根据值进行覆盖,在某些情况下需要映射成列表。即:List -> Map<Integer, List>的情况。

public class Main {
    public static void main(String[] args) {
        List<User> users = new ArrayList<>();
        users.add(new User(1, "user1", "email1@demo.com"));
        users.add(new User(2, "user2", "email2@demo.com"));
        users.add(new User(2, "user3", "email3@demo.com"));
        users.add(new User(4, "user4", "email4@demo.com"));

        Map<Integer, List<User>> userIdAndName = users.stream().collect(Collectors.groupingBy(User::getUserId));

        System.out.println(userIdAndName);
    }
}

输出:文章来源地址https://www.toymoban.com/news/detail-478192.html

{
    1=[User(userId=1, name=user1, email=email1@demo.com)], 
    2=[User(userId=2, name=user2, email=email2@demo.com), 
       User(userId=2, name=user3, email=email3@demo.com)], 
    4=[User(userId=4, name=user4, email=email4@demo.com)]
}

到了这里,关于Java8 - 将 List 集合转为 Map的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【Java基础】Java8 使用 stream().filter()过滤List对象(查找符合条件的对象集合)

    【Java基础】Java8 使用 stream().filter()过滤List对象(查找符合条件的对象集合)

    本篇主要说明在Java8及以上版本中,使用stream().filter()来过滤List对象,查找符合条件的集合。 集合对象以学生类(Student)为例,有学生的基本信息,包括:姓名,性别,年龄,身高,生日几项。 我的学生类代码如下: 下面来添加一些测试用的数据,代码如下: 添加过滤条件

    2024年02月12日
    浏览(48)
  • 使用java8 新特性stream流对List<Map<String, Object>>集合进行遍历、过滤、查询、去重、排序、分组

    对于一个ListMapString, Object类型的数据,可以使用Java 8的新特性stream流来进行遍历、过滤、查询、去重、排序、分组等操作。 遍历: 过滤: 查询: 去重: 排序: 分组:

    2024年02月10日
    浏览(55)
  • Set集合转为List集合常见的方式

    将 Set 转为 List 可以有多种方法,以下是两种常见的实现方式: 使用构造方法 可以使用 List 的构造方法 ArrayList(Collection? extends E c) 将 Set 转换成 List。具体实现步骤如下: 在上述示例中,首先创建了一个 Set,然后使用 add 方法向 Set 中添加元素。接着,使用 ArrayList 的构造方法

    2024年02月11日
    浏览(8)
  • Data与Java8中的LocalDate相互转换

    Data与Java8中的LocalDate相互转换

    一、前言 Date这个类在 java.util包 中,始于jdk1.0。后来在jdk1.8时,针对日期类进行了一个大的更新,专门新建了 java.time包 ,新的日期类LocalDateTime就在这个包中。 日常工作中,很容易碰到旧日期类Date,与新日期类LocalDateTime的相互转换。下面就介绍一下如何进行转换 二、思路

    2024年02月16日
    浏览(9)
  • Java8 List<Object> 转成 List<JSONObject>

       Java8 List<Object> 转成 List<Map<String, Object>>

    2024年02月16日
    浏览(9)
  • java中,将List<Map>转为List<实体>或者List<实体>转为List<Map>

    1、ListMap转List实体  2、List实体转ListMap

    2024年01月24日
    浏览(15)
  • Java8 list多属性去重

    Java8 list多属性去重

    大家好,我是三叔,很高兴这期又和大家见面了,一个奋斗在互联网的打工人。 在 Java 开发中,我们经常会面临对 List 中的对象属性去重的需求。然而,当需要根据多个属性来进行去重时,情况会稍微复杂一些。本篇博客将深入探讨如何使用 Java 8 的 Stream API 来实现 List 多属

    2024年02月14日
    浏览(220)
  • @NoArgsConstructor、@AllArgsConstructor、@RequiredArgsConstructor的区别和@Data和@Builder的用法以及在idea中使用的注意事项

    @NoArgsConstructor、@AllArgsConstructor、@RequiredArgsConstructor的区别和@Data和@Builder的用法以及在idea中使用的注意事项

    1、区别         @NoArgsConstructor:注解在类上,为类提供一个无参的构造方法。         @AllArgsConstructor:注解在类上,为类提供一个全参的构造方法         @RequiredArgsConstructor:注解在类上,会生成构造方法(可能带参数也可能不带参数)。注意:@RequiredArgsConstr

    2024年04月26日
    浏览(12)
  • java8 List根据元素对象属性去重

    1.使用Collectors.collectingAndThen链式去重 代码: main: 结果: 或者可以利用map也可以: 或: 或者不用链式也可以分开: Collectors.collectingAndThen()  函数应该最像  map and reduce  了, 它可接受两个参数,第一个参数用于  reduce 操作,而第二参数用于  map 操作 。 也就是, 先把流中

    2024年02月12日
    浏览(48)
  • Java8特性,Stream流的使用,收集成为map集合

    Java 8引入了Stream API,这是Java集合操作的一个重大改进。Stream API提供了一种高效且易于使用的处理数据的方式。 Stream是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。注意:Stream自己不会存储元素,它不会改变源对象,反而它的操作会返回一个全新的Strea

    2024年04月22日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包