我试图编写一段执行以下操作的代码(伪编码),但是使用流。我试图解决这个问题,但我似乎无法正确映射它。我可能错过了一些我忽视某些事情的知识。有人有帮助我的知识吗?
提前致谢!! : - )
Map<X, List<Y>> result= ...;
List<X> allX = getAllNeededX();
for(X x : allX) {
List<Y> matchingY = getMatchingY(x.id);
SortListOfYByProperty
result.put(x, sortedY)
}
答案 0 :(得分:2)
以下是一些选项。
public static void main(String[] args) {
Map<X, List<Y>> results = new HashMap<>();
List<X> allX = getAllX();
//simple way to just replace old for loop with forEach
allX.stream().forEach(x -> {
List<Y> matchingY = getMatchingY(x.id);
sortListY(matchingY);
results.put(x, matchingY);
});
//a little bit fancier, assumes sortListY return List<Y>
allX.stream()
.map((X x) -> new AbstractMap.SimpleEntry<>(x, sortListY(getMatchingY(x.id))))
.forEach(e -> results.put(e.getKey(), e.getValue()));
//more fancy, assumes sortListY return List<Y>
Map<X, List<Y>> results2 = allX.stream()
.map((X x) -> new AbstractMap.SimpleEntry<>(x, sortListY(getMatchingY(x.id))))
.collect(Collectors.toMap(Entry::getKey, Entry::getValue));
//most fancy, assumes sortListY return List<Y>
Map<X, List<Y>> results3 = allX.stream()
.collect(Collectors.toMap(Function.identity(), x -> sortListY(getMatchingY(x.id))));
//most fancy part 2, assumes sortListY return List<Y>
Map<X, List<Y>> results4 = allX.stream()
.collect(Collectors.toMap(x -> x, x -> sortListY(getMatchingY(x.id))));
}
答案 1 :(得分:1)
我可以为Y的排序列表创建第一个X列表和一个单独的流,但是我无法将它们全部组合起来。
通过迪迪埃的链接,我来到了以下,这使我的单位成功:
return getAllX().stream().collect(toMap(x -> x, x -> getSortedAndMatchingY(x.id)));
通过将排序移动到一个单独的方法,如上面的答案所示,并使用链接中的一些输入,这一点浮现在脑海中,它似乎有效。感谢您输入:-)