我想使用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;
}
}
答案 0 :(得分:0)
这样的事情:
List<Properties> properties = ...
Map<String, String> map = properties.stream()
.collect(Collectors.toMap(prop -> prop.getSubProperty().getName(), prop -> prop.getValue()));
答案 1 :(得分:0)
使用Map
从Stream
构建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())));