Java 8: перебирайте список и добавляйте на карту в зависимости от условия - PullRequest
2 голосов
/ 13 апреля 2019

У меня есть список, который я перебираю, и при некоторых условиях каждого элемента я добавляю каждый элемент списка в структуру данных в определенной позиции. Ниже приведен код в Java 7.

Структура данных, в которую я добавляю каждый элемент из списка:

/* The data structure has two slots, one for parents and another for children */
MenuBar menuBar = new MenuBar();

Теперь фрагмент кода:

MenuBar menuBar = new MenuBar();
for (Menu menu : menuList) {
    if (isParentMenu(menu.getId())) {
        menuBar.addMenu(menu);
    } else {
        Menu parent = getMenuById(menu.getParentId());
        menuBar.addChildMenu(parent, menu);
    }
}

Сейчас я пытаюсь создать Java8 код эквивалентен тому же, вот то, что я пытаюсь,

// The following code is not complete , just trying
   menuList.stream().filter(menu -> isParentMenu(menu.getId()))
   .map(menu -> menuBar.addMenu(menu))

Ответы [ 2 ]

2 голосов
/ 13 апреля 2019

Я не думаю, что ваш код нужно менять, если честно. Как сейчас, это достаточно ясно. Изменение его на потоки может даже добавить некоторые издержки, делая его менее производительным, чем цикл.

Действительно простым решением для потоков было бы:

MenuBar menuBar = new MenuBar();
menuList.stream().forEach(x -> {
    if (isParentMenu(x.getId())) {
        menuBar.addMenu(x);
    } else {
        Menu parent = getMenuById(x.getParentId());
        menuBar.addChildMenu(parent, x);
    }
});

В качестве альтернативы вы можете использовать partitioningBy:

Map<Boolean, List<Menu>> map = menuList.stream().collect(Collectors.partitioningBy(x -> isParentMenu(x.getId())));
map.get(true).stream().forEach(menuBar::addMenu);
map.get(false).stream().forEach(x -> {
    Menu parent = getMenuById(x.getParentId());
    menuBar.addChildMenu(parent, x);
});
1 голос
/ 13 апреля 2019

Вы хотите использовать фильтр, который вам нужно запустить forEach дважды, или вы пишете if-else внутри одного forEach. Примерно так:

menuList.stream().forEach(
                    menu -> {
                        if(isParentMenu(menu.getId()) {
                            menuBar.addMenu(menu);
                        } else {
                            Menu parent = getMenuById(menu.getParentId());
                            menuBar.addChildMenu(parent, menu);
                        }
                    }
            );
...