Java 如何在函数中应用<;T、 R>;列表中的参数(非列表)
我有一个方法,它将company作为键返回,将employeer列表作为值返回Java 如何在函数中应用<;T、 R>;列表中的参数(非列表),java,functional-programming,java-stream,functional-interface,Java,Functional Programming,Java Stream,Functional Interface,我有一个方法,它将company作为键返回,将employeer列表作为值返回 映射getUserPerCompany(最终函数转换器)。 该方法接受converter参数,该参数在测试中返回字符串(员工的姓名+姓氏)。它应该返回:Map。我创建了这个实现: 返回getUserStream().collect(toMap(Company::getName,c->converter.apply(c.getUsers())) 错误是: 函数中的应用(domain.User)不能应用于(java.ut
映射getUserPerCompany(最终函数转换器)
。
该方法接受converter
参数,该参数在测试中返回字符串(员工的姓名+姓氏)。它应该返回:Map
。我创建了这个实现:
返回getUserStream().collect(toMap(Company::getName,c->converter.apply(c.getUsers()))代码>
错误是:
函数中的应用(domain.User)不能应用于(java.util.List)
我的问题是,我不知道如何将员工传递到“申请”列表,而不是完整的列表
我的其他尝试:
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())))代码>
返回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())
));
}
Map getUserPerCompany(最终函数转换器){
返回getUserStream().collect(Collectors.toMap(
c->c.getName(),
c->c.getUsers()
.stream()
.map(转换器)
.collect(收集器.toList())
));
}
用法示例是
final Map<String, List<String>> users = getUserPerCompany(user -> user.getName() + " " + user.getSurname());
final-Map-users=getUserPerCompany(user->user.getName()+“”+user.getName());
基本上,您需要映射每个
用户,应用输入功能
您可以使用收集器。groupingBy()
并编写自定义收集器
:
<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;
}
)
)
);
}
Map getUserPerCompany(最终函数转换器){
返回getUserStream().collect(
收集者分组(
c->c.getName(),
收藏(
ArrayList::新建,//初始化累加器
(list,c)->c.getUsers()//处理每个元素
.stream()
.map(转换器)
.forEach(列表::添加),
(结果1,结果2)->{//汇流2累加器
result1.addAll(result2);//并行执行
返回结果1;
}
)
)
);
}
请不要阅读问题,但首先n“来自列表(非列表)”的标题不清楚。非常感谢!我刚刚将getUserStream()
替换为getCompanyStream()
(公司包含用户),但这些是我的内部方法,不在这里。再次感谢您提供的解决方案,它有效且清晰。Stream
低于fori
和foreach
=>替换它使用for