使用 List、stream、Java 8 中的嵌套属性创建嵌套地图
creating nested maps with nested properties from List, stream, Java 8
我做了这个问题
class EntityCompositeId {
private Long firstId;
private Long secondId;
// getter & setter...
}
class EntityComposite {
private EntityCompositeId id;
private String first;
private String second;
// getter & setter...
}
List<EntityComposite> listEntityComposite = ....
Supose this content
1, 1, "firstA", "secondBirdOne"
1, 2, "firstA", "secondBirdTwo"
1, 3, "firstA", "secondBirdThree"
2, 1, "firstB", "secondCatOne"
2, 2, "firstB", "secondCatTwo"
2, 3, "firstB", "secondCatThree"
3, 1, "firstC", "secondDogOne"
3, 2, "firstC", "secondDogTwo"
3, 3, "firstC", "secondDogThree"
Map<Long, Map<Long, String>> listOfLists = new HashMap<>();
现在使用我想要填充的流:
1 -> {1 ->"secondBirdOne", 2 -> "secondBirdTwo", 3 -> "secondBirdThree"}
2 -> {1 ->"secondCatOne", 2 -> "secondCatTwo", 3 -> "secondCatThree"}
3 -> {1 ->"secondDogOne", 2 -> "secondDogTwo", 3 -> "secondDogThree"}
我的非功能代码是:
Map<Long, Map<Long, String>> listaMunDepa = listEntityComposite.stream()
.collect(Collectors.groupingBy(
e -> e.getId().getFirstId(),
Collectors.toMap(f -> f.getId().getSecondId(), Function.identity()))
);
第二次尝试
Map<Long, Map<Long, String>> listaMunDepa = listEntityComposite.stream()
.collect(Collectors.groupingBy(
e -> e.getId().getFirstId(),
Collectors.groupingBy(EntityComposite::getId::getSecondId, EntityComposite::getSecond)) // How change this line
);
你非常接近,而不是通过Function.identity
,你应该通过EntityComposite::getSecond
listEntityComposite.stream()
.collect(groupingBy(e -> e.getId().getFirstId(),
toMap(f -> f.getId().getSecondId(), EntityComposite::getSecond)));
因为您提供了 Function.identity
结果是 Map<Long, Map<Long, EntityComposite>>
,所以如上所示,您只需要为提供给 valueMapper
的函数提取 getSecondId
toMap
因此产生 Map<Long, Map<Long, String>>
.
我做了这个问题
class EntityCompositeId {
private Long firstId;
private Long secondId;
// getter & setter...
}
class EntityComposite {
private EntityCompositeId id;
private String first;
private String second;
// getter & setter...
}
List<EntityComposite> listEntityComposite = ....
Supose this content
1, 1, "firstA", "secondBirdOne"
1, 2, "firstA", "secondBirdTwo"
1, 3, "firstA", "secondBirdThree"
2, 1, "firstB", "secondCatOne"
2, 2, "firstB", "secondCatTwo"
2, 3, "firstB", "secondCatThree"
3, 1, "firstC", "secondDogOne"
3, 2, "firstC", "secondDogTwo"
3, 3, "firstC", "secondDogThree"
Map<Long, Map<Long, String>> listOfLists = new HashMap<>();
现在使用我想要填充的流:
1 -> {1 ->"secondBirdOne", 2 -> "secondBirdTwo", 3 -> "secondBirdThree"}
2 -> {1 ->"secondCatOne", 2 -> "secondCatTwo", 3 -> "secondCatThree"}
3 -> {1 ->"secondDogOne", 2 -> "secondDogTwo", 3 -> "secondDogThree"}
我的非功能代码是:
Map<Long, Map<Long, String>> listaMunDepa = listEntityComposite.stream()
.collect(Collectors.groupingBy(
e -> e.getId().getFirstId(),
Collectors.toMap(f -> f.getId().getSecondId(), Function.identity()))
);
第二次尝试
Map<Long, Map<Long, String>> listaMunDepa = listEntityComposite.stream()
.collect(Collectors.groupingBy(
e -> e.getId().getFirstId(),
Collectors.groupingBy(EntityComposite::getId::getSecondId, EntityComposite::getSecond)) // How change this line
);
你非常接近,而不是通过Function.identity
,你应该通过EntityComposite::getSecond
listEntityComposite.stream()
.collect(groupingBy(e -> e.getId().getFirstId(),
toMap(f -> f.getId().getSecondId(), EntityComposite::getSecond)));
因为您提供了 Function.identity
结果是 Map<Long, Map<Long, EntityComposite>>
,所以如上所示,您只需要为提供给 valueMapper
的函数提取 getSecondId
toMap
因此产生 Map<Long, Map<Long, String>>
.