如何避免这个map的lambdas和stream的嵌套循环

时间:2018-05-13 22:41:39

标签: java loops foreach hashmap java-stream

我想改进这个算法,避免生成嵌套循环,也许利用流和java 8函数。 对于每个键,我想创建一个对象(TreeView,一个JavaFx的对象),并且在键上相关的foreach值为树对象创建一个新的“子”。

Map<MyEnum, List<myObject>> myMap = new HashMap<>();
List<TreeItem<String>> product = new ArrayList<>();
myMap.forEach((k,v) -> {  
            TreeItem<String> fatherItem = new TreeItem<String> (k.getName());
            myMap.get(k).forEach(e -> {
                    fatherItem.getChildren().add(new TreeItem<String> (e.getName());
            });
      product.add(fatherItem);
});

我真的很好奇如何改进它。提前感谢您的回答!

2 个答案:

答案 0 :(得分:0)

您的地图的结构方式和您想要实现的输出,最好使用嵌套循环以获得更好的性能。但是,不鼓励使用forEach,请以这种方式使用mapcollect

"val_1"

答案 1 :(得分:0)

我建议你创建一个新的方法来将一个键和列表转换成一个树项 - 这将使你的代码比在lambda块中更清晰:

private TreeItem<String> makeTree(MyEnum root, List<MyClass> items) {
    TreeItem<String> tree = new TreeItem<>(root.getName());
    items.stream().map(MyClass::getName).map(TreeItem::new).forEach(tree::add);
    return tree;
}

这可以在一个收集器中完成,但实际上,我认为它不会使您的代码更清晰。

然后将地图转换为树木列表:

List<TreeMap<String>> trees = map.entrySet().stream()
    .map(e -> makeTree(e.getKey(), e.getValue()))
    .collect(Collectors.toList());