问题描述
我有一个方法,返回公司作为关键字和雇员列表作为值<T> Map<String, List<T>> getUserPerCompany(final Function<User, T> converter)
。
该方法接受converter
参数,该参数在测试中返回String(员工的姓名+姓氏)。
它应该返回: Map<String, List<String>>
。
我创建了这个实现:
return getUserStream().collect(toMap(Company::getName, c -> converter.apply(c.getUsers())));
错误是: apply (domain.User) in Function cannot be applied to (java.util.List<domain.User>)
我的问题是我不知道如何将员工传递到'apply'列表而不是完整列表。
我的其他尝试:
-
return getUserStream().collect(toMap(Company::getName, c -> converter.apply((User) c.getUsers().listIterator())));
-
return getUserStream().collect(toMap(Company::getName, c -> converter.apply((User) c.getUsers().subList(0, c.getUsers().size()))));
-
return getUserStream().collect(toMap(Company::getName, c -> converter.apply((User) c.getUsers().iterator())));
1楼
我想这就是你要找的东西
<T> Map<String, List<T>> getUserPerCompany(final Function<User, T> converter) {
return getUserStream().collect(Collectors.toMap(
c -> c.getName(),
c -> c.getUsers()
.stream()
.map(converter)
.collect(Collectors.toList())
));
}
用法示例是
final Map<String, List<String>> users = getUserPerCompany(user -> user.getName() + " " + user.getSurname());
基本上你需要map
每个User
,应用输入Function
。
2楼
您可以使用Collectors.groupingBy()
并编写自定义Collector
:
<T> Map<String, List<T>> getUserPerCompany(final Function<User, T> converter) {
return getUserStream().collect(
Collectors.groupingBy(
c -> c.getName(),
Collector.of(
ArrayList::new, //init accumulator
(list, c)-> c.getUsers() //processing each element
.stream()
.map(converter)
.forEach(list::add),
(result1, result2) -> { //confluence 2 accumulators
result1.addAll(result2); //in parallel execution
return result1;
}
)
)
);
}