3 回答
TA贡献1786条经验 获得超13个赞
如果调用getCsByIds成本很高,那么您最初的想法很适合自己执行。它可以进一步缩短为:
public Map<A, List<C>> convert(Collection<A> as) {
List<Long> cIds = as.stream()
.flatMap(a -> a.getBs().stream())
.map(B::getIdOfC)
.collect(Collectors.toList());
Map<Long, C> csMap = getCsByIds(cIds).stream()
.collect(Collectors.toMap(C::getId, Function.identity()));
return as.stream()
.collect(Collectors.toMap(Function.identity(),
a -> a.getBs().stream().map(b -> csMap.get(b.getIdOfC()))
.collect(Collectors.toList()), (a, b) -> b));
}
您可以在其中相应地选择合并功能(a,b) -> b。
TA贡献1911条经验 获得超7个赞
也许只是直接迭代 As ?(手头没有编译器,所以片段可能没有编译就绪)
public Map<A, List<C>> convert(Collection<A> as) {
Map<A, List<C>> result = new HashMap<>();
for(A a: as){
List<Long> cIds = a.getBs().stream()
.map(B::getIdOfC)
.collect(Collectors.toList());
result.put(a, getCsByIds(cIds));
}
return result;
}
TA贡献1810条经验 获得超4个赞
像这样的东西不会起作用吗?我没有编译器,所以我无法真正测试它
public Map<A, List<C>> convert(Collection<A> as) {
return as.stream()
.collect(Collectors.toMap(Function::identity,
a -> a.getBs().stream()
.map(B::getIdOfC)
.flatMap(id -> getCsByIds(asList(id))
.values()
.stream())
.collect(Collectors.toList())
)
);
}
添加回答
举报