Remover elemento com propriedades duplicado com base em outra propriedade da lista usando java 8

Ellone:

Eu estou lutando para reduzir uma lista:

Digamos que eu tenho um List<Item> listItemscom uma Itemclasse 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;
    }
}

Agora, na minha listItemslista, eu tenho alguns elementos com a mesma effectpropriedade.

Eu quero remover todos os elementos da minha listItemslista com a mesma effectpropriedade, exceto aquele com a maior valuepropriedade. ( valueÉ o número representado como um String).

Além disso, eu quero manter todo o elemento com uma única effectpropriedade.

Como posso conseguir isso? Eu acho que eu vou ter que lidar com Comparator.

Federico Peralta Schaffner:

Parece que você quer agrupar os itens de sua lista effect, usando max(value)como uma agregação. Você pode fazer isso da seguinte forma:

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

A solução acima recolhe elementos do fluxo para um Map. Para isso, ele usa uma sobrecarga de Collectors.toMapque requer 3 argumentos:

  • keyMapper : a Functionque transforma elementos do fluxo de chaves
  • valueMapper : um Functionque transforma os elementos do fluxo de valores
  • mergeFunction : um BinaryOperatorque é usado para colisões resolver entre os valores associados com a mesma chave

Neste caso, a Item::getEffectreferência método está a ser utilizado como o keyMapper função, que transforma um Itemexemplo para a sua effect. Em seguida, Function.identity()está a ser utilizado como o valueMapper função, que não faz nada, isto é, deixa cada Iteminstância intocado. Finalmente, BinaryOperator.maxBy(Comparator.comparingInt(i -> Integer.parseInt(i.getValue())))está a ser utilizada como a mergeFunction, que é uma BinaryOperatorque recebe dois valores do mapa que ter a mesma chave (isto é, dois Itemcasos com o mesmo effect), e resolve a colisão no mapa, seleccionando o Itemexemplo que tem o máximo value( valueé primeiro convertidos para Integer, de modo que nós comparamos os valores numéricos em vez de cordas).

Acho que você gosta

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