将对象流收集到地图中

时间:2017-06-24 06:37:10

标签: java collections java-stream

我有一个用户详细信息的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简化上述代码?

3 个答案:

答案 0 :(得分:1)

你可以这样做

Map<String, MockUser> users = Files.lines(Paths.get(f.getAbsolutePath()))
                               .map(line -> line.split(","))
                               .map(fields -> new MockUser(fields[0], fields[1], fields[2]))
                               .collect(Collectors.groupingBy(MockUser::getUserName))

答案 1 :(得分:1)

最后了解到def onesInDecimal(n): count = 0 while(n!=0): if (n%2!=0): count = count+1 n = n-1 n = n/2 else: n = n/2 return count 不应该用于将流转换为地图。因为这会在列表中对类似结果进行分组,并将其作为Collectors.GroupingBy返回。我想要的是Map<String,List<T>>

浏览Javadocs后,我发现Map<String,T>这是我正在寻找的确切解决方案。

以下是我最后编写的代码。

Collectors.toMap

答案 2 :(得分:0)

尝试Collectors.groupingBy它是一种帮助方法,可以将流转换为地图,就像您所做的一样。