Retire el elemento con la propiedad duplicado basado en otra propiedad de la lista utilizando Java 8

Ellone:

Estoy luchando para reducir una lista:

Digamos que tengo una List<Item> listItemscon una Itemclase definida como:

public class Item {
    private String effect;
    private String value;

    public String getEffect() {
        return effect;
    }

    public void setEffect(String effect) {
        this.effect = effect;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

Ahora, en mi listItemslista, tengo algunos elementos con el mismo effectinmueble.

Quiero eliminar todo elemento de mi listItemslista con la misma effectpropiedad, excepto el que tiene la mayor valuepropiedad. ( valueEs el número representado como una String).

Además, yo quiero seguir todo el elemento con una única effectpropiedad.

¿Cómo puedo lograr eso? Creo que voy a tener que hacer frente Comparator.

Federico Peralta Schaffner:

Parece que desea agrupar los artículos de su lista effect, usando max(value)como una agregación. Esto se puede hacer de la siguiente manera:

Map<String, Item> byEffectHavingMaxValue = listItems.stream()
    .collect(Collectors.toMap(
            Item::getEffect,      // group by effect
            Function.identity(),  // keep items as values
            BinaryOperator.maxBy( // when effect exists, keep the item with max value
                    Comparator.comparingInt(i -> Integer.parseInt(i.getValue())))));

Collection<Item> result = byEffectHavingMaxValue.values();

La solución anterior elementos recopila de la corriente a una Map. Para ello, se utiliza una sobrecarga de Collectors.toMapque requiere de 3 argumentos:

  • KeyMapper : una Functionque transforma elementos de la corriente a las teclas
  • valueMapper : a Functionque transforma elementos de la corriente a valores
  • mergeFunction : una BinaryOperatorque se utiliza para resolver las colisiones entre los valores asociados con la misma clave

En este caso, la Item::getEffectreferencia del método se está utilizando como la KeyMapper función, que transforma una Iteminstancia en la effect. A continuación, Function.identity()se utiliza como el valueMapper función, que no hace nada, es decir, se deja a cada Iteminstancia sin tocar. Finalmente, BinaryOperator.maxBy(Comparator.comparingInt(i -> Integer.parseInt(i.getValue())))se está utilizando como la mergeFunction, que es una BinaryOperatorque recibe dos valores del mapa que tienen la misma clave (es decir, dos Iteminstancias con la misma effect), y se resuelve la colisión en el mapa mediante la selección de la Iteminstancia que tiene la max value( valuees primero Convertido a Integer, de modo que se comparan los valores numéricos en lugar de cuerdas).

Supongo que te gusta

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