Java 8:遍历列表并根据条件添加到地图

时间:2019-04-13 07:56:39

标签: java java-8 java-stream

我有一个要迭代的List,并且在每个元素的某种条件下,我将List的每个元素添加到特定位置的数据结构中,以下是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);
    }
}

现在,我正在努力创建与Java 8相同的代码,以下是我正在尝试的工作,

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

2 个答案:

答案 0 :(得分:2)

说实话,我认为您的代码不需要更改。就目前而言,已经足够清楚了。将其更改为流甚至可能会增加一些开销,从而使其性能不如循环。

一个非常简单的流解决方案是:

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 :(得分:1)

您要使用过滤器,则需要两次运行forEach,或者在单个forEach中编写if-else。像这样:

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