Java 将对象列表转换为映射<;字符串,字符串>;使用jdk8lambdas

Java 将对象列表转换为映射<;字符串,字符串>;使用jdk8lambdas,java,lambda,java-8,Java,Lambda,Java 8,我想使用jdk 8 lambdas将列表转换为映射,而无需执行for循环。映射应包含作为subperty.name的键和作为Properties.value的值 public class Properties { private SubProperty subProperty; private String value; public SubProperty getSubProperty() { return subProperty;

我想使用jdk 8 lambdas将
列表
转换为
映射
,而无需执行for循环。映射应包含作为subperty.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;
    }
}
大概是这样的:

List<Properties> properties = ...
Map<String, String> map = properties.stream()
    .collect(Collectors.toMap(prop -> prop.getSubProperty().getName(), prop -> prop.getValue()));
列表属性=。。。
Map=properties.stream()
.collect(Collectors.toMap(prop->prop.getSubperty().getName(),prop->prop.getValue());

<代码> > p>当您从<代码>流>代码> >使用<代码>收藏夹.ToMax()/Cux>时,必须考虑您的<代码>流>代码>是否包含重复的键。在您的情况下,重复键意味着具有相同名称的
子属性的多个
属性
实例

要解析重复项,可以使用收集器.toMap的3参数变量
Collectors.toMap
。例如,当遇到重复的键时,下面将选择一个
getValue()
值:

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

我投票将这个问题作为离题题来结束,因为:它看起来像是建议家庭作业的基本流练习,但是。您问题的当前状态不符合这些要求。使用选项进行改进。也请阅读本文,感谢您的建议我在eclipse中也做了同样的事情,但不确定为什么它只显示对象方法。如果试图存储映射中已存在的密钥,则由Collectors.toMap创建的收集器将抛出
IllegalStateException
。如果要在映射中收集项目,并且希望源中有重复的条目,则应使用
Collectors.toMap(Function,Function,BinaryOperator)
方法。这是正确和完整的答案。@AlexMamo,除非你知道你不会有重复的,如果你想要那个例外。。。
Map<String,List<String>> map = 
    list.stream()
        .collect(Collectors.groupingBy(p -> p.getSubProperty().getName(),
                                       Collectors.mapping(Properties::getValue,
                                                          Collectors.toList())));