栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java8流List转Map

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java8流List转Map

  • 我们有一个用户信息类

通过JAVA8的流操作需要转换成userId为key, name为value的map。

public class User {
   private Integer userId;
   private String name;
   private String email;

    public User(Integer userId, String name, String email) {
        this.userId = userId;
        this.name = name;
        this.email = email;
    }

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "User{" +
                "userId=" + userId +
                ", name='" + name + ''' +
                ", email='" + email + ''' +
                '}';
    }
}
复制代码
  • 实现代码
public class ListToMap {
    public static void main(String[] args) {
        List 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 userIdAndName = users.stream()
                .collect(Collectors.toMap(User::getUserId, User::getName));
        System.out.println(userIdAndName);
    }
}
复制代码

输出结果

  • userId为key,用户对象为value
public class ListToMap {
    public static void main(String[] args) {
        List 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 userIdAndUser = users.stream()
                .collect(Collectors.toMap(User::getUserId, user-> user));
        System.out.println(userIdAndUser);
    }
}
复制代码

输出

  • 重复的key处理

在转换过程中,如果出现相同的key,那么会抛出重复key的异常。

我们将userId为3的修改为2,和第二个用户冲突

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

public class ListToMap {
    public static void main(String[] args) {
        List 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 userIdAndUser = users.stream()
                .collect(Collectors.toMap(User::getUserId, user-> user, (oldValue, newValue) -> newValue));
        System.out.println(userIdAndUser);
    }
}
复制代码

选取新的值覆盖旧的值,得到的结果

只会出现user3,而user2被覆盖掉了。

  • 将ID和用户列表进行映射

刚才上面出现重复的ID,是根据值进行覆盖,如果在某些情况下需要映射成列表。

即:List -> Map的情况

这需要使用到groupingBy

public class ListToMap {
    public static void main(String[] args) {
        List 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> userMap = users.stream()
                .collect(Collectors.groupingBy(User::getUserId));
        System.out.println(userMap);
    }
}
复制代码

ID为2的出现多条数据。

  • 指定Map类型

Collectors.toMap支持第四个参数,对map类型进行实例化

public class ListToMap {
    public static void main(String[] args) {
        List 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 userIdAndUser = users.stream()
                .collect(Collectors.toMap(User::getUserId, user-> user, (oldValue, newValue) -> newValue, ConcurrentHashMap::new));
        System.out.println(userIdAndUser);
        System.out.println(userIdAndUser.getClass());
    }
}
复制代码

输出

userIdAndUser类的类型是ConcurrentHashMap

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/953189.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号