我有一个用户详细信息的 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] 删除。
我来说两句