我有一个用户详细信息的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
简化上述代码?
答案 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它是一种帮助方法,可以将流转换为地图,就像您所做的一样。