如何在 List(不是 List)的 Function<T, R> 参数中应用
How to apply in Function<T, R> argument from List (not List)
我有一个方法,其中 returns 公司作为键,员工列表作为值
<T> Map<String, List<T>> getUserPerCompany(final Function<User, T> converter)
。
该方法接受 converter
参数,该参数在测试中 returns 字符串(员工的姓名 + 姓氏)。它应该 returns: 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())));
我想这就是您要找的东西
<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
.
您可以使用 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;
}
)
)
);
}
我有一个方法,其中 returns 公司作为键,员工列表作为值
<T> Map<String, List<T>> getUserPerCompany(final Function<User, T> converter)
。
该方法接受 converter
参数,该参数在测试中 returns 字符串(员工的姓名 + 姓氏)。它应该 returns: 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())));
我想这就是您要找的东西
<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
.
您可以使用 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;
}
)
)
);
}