Stream()。map()结果作为Collectors.toMap()的值

时间:2019-08-30 06:32:09

标签: java java-8 java-stream

我有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>>)

2 个答案:

答案 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)));     
}