Java流List <x>到Map <x,list <y =“”>&gt;

时间:2017-04-23 12:15:11

标签: java java-8 java-stream

我试图编写一段执行以下操作的代码(伪编码),但是使用流。我试图解决这个问题,但我似乎无法正确映射它。我可能错过了一些我忽视某些事情的知识。有人有帮助我的知识吗?

提前致谢!! : - )

Map<X, List<Y>> result= ...;

List<X> allX = getAllNeededX();
for(X x : allX) {
    List<Y> matchingY = getMatchingY(x.id);
    SortListOfYByProperty
    result.put(x, sortedY)
}

2 个答案:

答案 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)));

通过将排序移动到一个单独的方法,如上面的答案所示,并使用链接中的一些输入,这一点浮现在脑海中,它似乎有效。感谢您输入:-)