我有一个要迭代的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))
答案 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);
}
}
);