Java 8: Iterar a través de una lista y añadir a un mapa basado en la condición

Arpan Das:

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))
barredora:

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);
});

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=239867&siteId=1
Recomendado
Clasificación