我有List<InstanceWrapper>
,对于每个元素,我都想做一些逻辑运算,从而得出String message
。然后,我要创建Map<String, String>
,其中键为InstanceWrapper:ID
,值为message
;
private String handle(InstanceWrapper instance, String status) {
return "logic result...";
}
private Map<String, String> handleInstances(List<InstanceWrapper> instances, String status) {
return instances.stream().map(instance -> handle(instance, status))
.collect(Collectors.toMap(InstanceWrapper::getID, msg -> msg));
}
但是我不会得到编译结果,如何将stream().map()
的结果放入collectors.toMap()
的值中?
The method collect(Collector<? super String,A,R>) in the type Stream<String> is not applicable for the arguments (Collector<InstanceWrapper,capture#5-of ?,Map<String,Object>>)
答案 0 :(得分:5)
您无法在收集地图之前进行映射,因为这样您将获得Stream
个中的String
个,并且丢失了有关InstanceWrapper
的信息。 Stream#toMap
需要两个lambda,一个用于生成键,第二个用于生成值。应该是这样的:
instances.stream()
.collect(Collectors.toMap(InstanceWrapper::getID, instance -> handle(instance, status));
第一个lambda生成键:InstanceWrapper::getID
,第二个lambda生成键:关联的值:instance -> handle(instance, status)
。
答案 1 :(得分:3)
您将每个InstanceWrapper
映射到一个字符串,但是如果以后要使用InstanceWrapper
提取其ID,则不能这样做。尝试这样的事情:
return instances.stream()
.collect(Collectors.toMap(InstanceWrapper::getID, (InstanceWrapper instanceWrapper) -> this.handle(instanceWrapper, status)));
编辑:
要美化这一点,您可以模拟一下类似这样的curring:
private Function<InstanceWrapper, String> handle(String status) {
return (InstanceWrapper instanceWrapper) -> "logic result...";
}
private Map<String, String> handleInstances(List<InstanceWrapper> instances, String status) {
return instances.stream()
.collect(Collectors.toMap(InstanceWrapper::getID, this.handle(status)));
}