如何使用流转换Map值
How to convert Map value using stream
我有一个任务:
Return 公司地图,其中键是其名称,值是存储为字符串的员工列表,由 firstName
和 lastName
组成,由 space 分隔。
这是我的解决方案,效果很好:
Map<String, List<String>> getUserPerCompanyAsString() {
return getCompanyStream()
.collect(Collectors.toMap(Company::getName, company -> getUserNames(company.getUsers())));
}
private List<String> getUserNames(List<User> users) {
return users.stream()
.map(user -> user.getFirstName() + " " + user.getLastName())
.collect(Collectors.toList());
}
public class Company {
private final String name;
private final List<User> users;
}
public class User {
private final String firstName;
private final String lastName;
private final Sex sex;
private final int age;
private final List<Account> accounts;
private final List<Permit> permits;
}
所以我的问题是,如何将 List<User>
作为映射值转换为 List<String>
,其中 firstName
和 lastName
在一个流链中由 space 分隔而不辅助方法?
解决方案
感谢 Thomas 的建议,我可以在没有辅助方法的情况下解决这个问题:
Map<String, List<String>> getUserPerCompanyAsString() {
return getCompanyStream()
.collect(Collectors.toMap(Company::getName, company -> company.getUsers().stream()
.map(user -> user.getFirstName() + " " + user.getLastName())
.collect(Collectors.toList())));
我知道您想使用辅助方法。
一种更简洁的方法是将 getUserNames
方法包含在 Company
中,这比将此逻辑挂在 Collector
.
中更有意义
解决方案的可读性也会更高
Map<String, List<String>> getUserPerCompanyAsString() {
return getCompanyStream().collect(
Collectors.toMap(
Company::getName,
Company::getUserNames
)
);
}
public class Company {
private final String name;
private final List<User> users;
// Constructor making sure users is not null
private List<String> getUserNames() {
return this.users
.stream()
.map(User::getFullName)
.collect(Collectors.toList());
}
}
public class User {
private final String firstName;
private final String lastName;
// Etc.
public String getFullName() {
return firstName + " " + lastName;
}
}
我有一个任务:
Return 公司地图,其中键是其名称,值是存储为字符串的员工列表,由 firstName
和 lastName
组成,由 space 分隔。
这是我的解决方案,效果很好:
Map<String, List<String>> getUserPerCompanyAsString() {
return getCompanyStream()
.collect(Collectors.toMap(Company::getName, company -> getUserNames(company.getUsers())));
}
private List<String> getUserNames(List<User> users) {
return users.stream()
.map(user -> user.getFirstName() + " " + user.getLastName())
.collect(Collectors.toList());
}
public class Company {
private final String name;
private final List<User> users;
}
public class User {
private final String firstName;
private final String lastName;
private final Sex sex;
private final int age;
private final List<Account> accounts;
private final List<Permit> permits;
}
所以我的问题是,如何将 List<User>
作为映射值转换为 List<String>
,其中 firstName
和 lastName
在一个流链中由 space 分隔而不辅助方法?
解决方案
感谢 Thomas 的建议,我可以在没有辅助方法的情况下解决这个问题:
Map<String, List<String>> getUserPerCompanyAsString() {
return getCompanyStream()
.collect(Collectors.toMap(Company::getName, company -> company.getUsers().stream()
.map(user -> user.getFirstName() + " " + user.getLastName())
.collect(Collectors.toList())));
我知道您想使用辅助方法。
一种更简洁的方法是将 getUserNames
方法包含在 Company
中,这比将此逻辑挂在 Collector
.
解决方案的可读性也会更高
Map<String, List<String>> getUserPerCompanyAsString() {
return getCompanyStream().collect(
Collectors.toMap(
Company::getName,
Company::getUserNames
)
);
}
public class Company {
private final String name;
private final List<User> users;
// Constructor making sure users is not null
private List<String> getUserNames() {
return this.users
.stream()
.map(User::getFullName)
.collect(Collectors.toList());
}
}
public class User {
private final String firstName;
private final String lastName;
// Etc.
public String getFullName() {
return firstName + " " + lastName;
}
}