将对象流收集到 Map 中

安巴扎干王

我有一个用户详细信息的 csv 文件,我必须通过读取每一行将其加载到 HashMap 中。这是在 Java 8 流的帮助下完成的。

 Map<String,MockUser> users = new HashMap<>();
 try (Stream<String> stream = Files.lines(Paths.get(f.getAbsolutePath()))) {
            stream.forEach(s -> {
                String[] fields = s.split(",");
                MockUser user = new MockUser(fields[0], fields[1], fields[2]);
                users.put(user.getUsername(), user);
            });    
        } catch (IOException e) {
            e.printStackTrace();
        }


private class MockUser {
        String username;
        String password;
        String role;

        MockUser(String username, String password, String role) {
            this.username = username;
            this.password = password;
            this.role = role;
        }

        public String getUsername() {
            return username;
        }

        public void setUsername(String username) {
            this.username = username;
        }

        public String getPassword() {
            return password;
        }

        public void setPassword(String password) {
            this.password = password;
        }

        public String getRole() {
            return role;
        }

        public void setRole(String role) {
            this.role = role;
        }
    }

这很好用。但是,我必须编写 3 行代码来拆分流结果并将其添加到地图中。我尝试使用Stream.collect,但我完全无法正确理解这个东西?

有没有办法可以使用 简化上面的代码Stream.collect

安巴扎干王

终于明白Collectors.GroupingBy不应该用于将流转换为地图。因为这会将相似的结果分组到一个列表中,并将其作为Map<String,List<T>>. 我想要的是一个Map<String,T>.

在浏览了 Javadocs 之后,我找到Collectors.toMap了我正在寻找的确切解决方案。

下面是我最终编写的代码。

users = Files.lines(Paths.get(file.getAbsolutePath()))
                    .map(line -> line.split(","))
                    .map(fields -> new MockUser(fields[0], fields[1], fields[2]))
                    .collect(Collectors.toMap(
                            MockUser::getUsername,
                            user -> user));

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用Java流将多个列表收集到一个列表中?

通过其值过滤Map对象,而无需将结果收集到另一个map中

在Java 8中使用Lambda将流收集到HashMap中

有没有一种首选的方式将列表流收集到平面列表中?

如何将流中的元素收集到队列中?

如何在流中收集到TreeMap中?

如何在Java 8中将流的结果收集到自定义对象的数组中

Java8:按键将流收集到SortedMap中

Java 8收集到Map <String,List <Object >>

如何将Java 8流收集到Guava ImmutableCollection中?

将对象列表中的值收集到swift5中的字典中

Java流将数组收集到一个列表中

Java流将对象列表收集到存储桶

处理列表流并仅使用非空值收集到map / ImmutableMap中

使用groupingBy进入嵌套Map,但收集到其他类型的对象

按键对记录进行分组并收集到Flink流中的ListBuffer中

将流数据收集到角度应用程序中

将输入收集到数组中

如何将所有使用@RequestParam注释的字段收集到一个对象中

为什么在使用“ flat_map”时需要收集到向量中?

角度可观察对象以及如何遍历对象数组以将字段收集到数组中

批量收集到一个UNION查询到对象表中

如何在Swift 5中从自定义对象将所有元素收集到数组

在PL / SQL中使用批量收集到表对象类型中

将可迭代对象收集到一个变量中(列表)

无法将 Random int 流收集到 List 集合中

Map 中的 Java 流

Angular observable,如何遍历具有嵌套数组的对象以将字段收集到数组中

使用单个流将多个属性收集到 Map