Tengo una lista, que estoy interactuando sobre, y en alguna condición de cada elemento, estoy añadiendo cada elemento de la lista a una estructura de datos en una posición específica, es el código en Java 7.
La estructura de datos donde yo estoy añadiendo cada elemento de la lista es,
/* The data structure has two slots, one for parents and another for children */
MenuBar menuBar = new MenuBar();
Ahora es el fragmento de código,
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);
}
}
Ahora estoy luchando para crear un código Java 8 equivalente a la misma, que sigue es lo que estoy tratando de,
// The following code is not complete , just trying
menuList.stream().filter(menu -> isParentMenu(menu.getId()))
.map(menu -> menuBar.addMenu(menu))
No creo que sus necesidades de código para cambiar, para ser honesto. Como está ahora, es bastante claro. Si lo cambia a corrientes podría incluso añadir algunos gastos generales, por lo que es menos eficiente que un bucle.
Una solución corrientes muy simple sería:
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);
}
});
Como alternativa, puede utilizar 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);
});