通过附加键的值(如果存在)将列表转换为Java 8中的Map

时间:2019-07-02 15:21:53

标签: java list java-8 hashmap java-stream

我正在尝试将列表转换为地图。如果键存在,我只想合并两个值并用“,”将它们分开,然后将其分配给键。如果该键不存在,我只想直接将其分配为键值对,并希望为此使用流。

示例:

List<Object> listObject = {something1,something2,something3}
Map<String,String> listToMap = listObject.stream().collect(Collectors.toMap(listObject::getKey,listObject::getValue))

如果有重复的键,以上内容将出错。任何建议都对您有帮助。

1 个答案:

答案 0 :(得分:1)

为了使toMap处理重复的键,必须传递合并函数,该函数接受两个值并返回一个值。

在您的情况下,merge函数应将两个值连接起来:

List<Object> listObject = {something1,something2,something3}
Map<String,String> listToMap =    
    listObject.stream()
              .collect(Collectors.toMap(listObject::getKey,
                                        listObject::getValue,
                                        (v1,v2)->v1+","+v2));

如果您希望将相同键的值保存在List中,而不是将它们串联到单个String中,请使用groupingBy

List<Object> listObject = {something1,something2,something3}
Map<String,List<String>> listToMap =    
    listObject.stream()
              .collect(Collectors.groupingBy(listObject::getKey,
                                             Collectors.mapping(listObject::getValue,
                                                                Collectors.toList())));