我提出了这个问题 stream creating List of List (nested List) using forEach, 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"}
我的NOT功能代码为:
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
);
答案 0 :(得分:2)
您真的很接近,您应该通过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>>
,所以,如上所示,您只需要提取getSecondId
来提供给{{ 1}},因此产生valueMapper
。