как избежать вложенного цикла этой карты с лямбдами и потоками - PullRequest
0 голосов
/ 14 мая 2018

Я хотел бы улучшить этот алгоритм, избегая генерации вложенного цикла, возможно, используя функции stream и java 8. Для каждого ключа я хочу создать объект (TreeView, объект JavaFx), а значение foreach, связанное с ключом, создает нового «сына» для объекта Tree.

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 голосов
/ 14 мая 2018

Я предлагаю вам создать новый метод для преобразования ключа и списка в элемент дерева - это сделает код более понятным, чем в лямбда-блоке:

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());
0 голосов
/ 14 мая 2018

При структурировании вашей карты и желаемом результате лучше использовать вложенные циклы для повышения производительности.Однако использование forEach не рекомендуется, используйте map и collect следующим образом:

List<TreeItem<String>> product =
    map.entrySet().stream().map(
    t -> {
          TreeItem<String>father = new TreeItem<>(t.getKey().getName());
          List<TreeItem<String>> children = t.getValue()
                .stream()
                .map(u -> u.getName())
                .map(TreeItem::new)
                .collect (Collectors.toList());
         father.getChildren().addAll(children);
         return father;
     }
    ).collect (Collectors.toList());
...