Java Programación Funcional: Cómo convertir una escalera interior if-else para el lazo de estilo funcional?

Gopal S Akshintala:

La expectativa es Derivar 3 listas itemIsBoth, aItems, bItemsde la lista de entrada items. Cómo convertir un código como abajo para el estilo funcional? (Entiendo que este código es lo suficientemente clara en un estilo imperativo, pero me gustaría saber qué estilo declarativo realmente dejar de tratar con un ejemplo tan simple). Gracias.

for (Item item: items) {
    if (item.isA() && item.isB()) {
        itemIsBoth.add(item);
    } else if (item.isA()) {
        aItems.add(item);
    } else if (item.isB()){
        bItems.add(item)
    }
}
SDJ:

El título de la pregunta es bastante amplio (convertido escalera si-else), pero dado que la pregunta real le pregunta sobre un escenario específico, permítanme ofrecer una muestra de que al menos puede ilustrar lo que puede hacerse.

Debido a que la if-elseestructura crea tres listas distintas en base a un predicado aplicado al artículo, podemos expresar este comportamiento más declarativa como una operación de agrupación. La única necesita extra para hacer este trabajo fuera de la caja sería a colapsar las múltiples predicados booleanas a través de un objeto etiquetado. Por ejemplo:

class Item {
    enum Category {A, B, AB}

    public Category getCategory() {
        return /* ... */;
    }
}

Entonces la lógica se puede expresar simplemente como:

Map<Item.Category, List<Item>> categorized = 
    items.stream().collect(Collectors.groupingBy(Item::getCategory));

donde cada lista puede ser recuperada a partir del mapa dada su categoría.

Si no es posible el cambio de clase Item, el mismo efecto se puede lograr moviendo la declaración de enumeración y el método de categorización outsize la Itemclase (el método se convertiría en un método estático).

Supongo que te gusta

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