使用jdk 8 lambdas将对象列表转换为Map <string,string>

时间:2017-12-08 19:23:40

标签: java lambda java-8

我想使用jdk 8 lambdas将List<Properies>转换为Map<String,String>而不进行for循环。映射应包含键作为SubProperty.name,值作为Properties.value。

public class Properties
{
    private SubProperty subProperty;

    private String value;

    public SubProperty getSubProperty()
    {
        return subProperty;
    }

    public void setSubProperty(SubProperty subProperty)
    {
        this.subProperty = subProperty;
    }

    public String getValue()
    {
        return value;
    }

    public void setValue(String value)
    {
        this.value = value;
    }
}

public class SubProperty
{
    private String category;
    private String name;

    public String getCategory()
    {
        return category;
    }

    public void setCategory(String category)
    {
        this.category = category;
    }

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }
}

2 个答案:

答案 0 :(得分:0)

这样的事情:

List<Properties> properties = ...
Map<String, String> map = properties.stream()
    .collect(Collectors.toMap(prop -> prop.getSubProperty().getName(), prop -> prop.getValue()));

答案 1 :(得分:0)

使用MapStream构建Collectors.toMap()时,您必须考虑Stream是否包含重复的密钥。在您的情况下,重复键意味着多个Properties实例具有相同名称的SubProperty

要解决重复项,您可以使用Collectors.toMap的3参数变体。例如,以下将在遇到重复键时选择getValue()值之一:

Map<String,String> map = 
    list.stream()
        .collect(Collectors.toMap(p -> p.getSubProperty().getName(),
                                  Properties::getValue,
                                  (v1,v2) -> v1));

另一种选择是使用Collectors.groupingBy,它会将共享相同密钥的值分组到List中:

Map<String,List<String>> map = 
    list.stream()
        .collect(Collectors.groupingBy(p -> p.getSubProperty().getName(),
                                       Collectors.mapping(Properties::getValue,
                                                          Collectors.toList())));