Grupo una lista dentro de un objeto de múltiples atributos: Java 8

Gripa Lauro Neto:

¿Cómo hacer el grupo I una lista dentro de un objeto por dos de los atributos de los objetos?

Estoy usando Drools 7.9.0 y Java 8. Tengo una Resultclase que se utiliza como retorno a cada regla Drools emparejado.

import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

@Data
@NoArgsConstructor
public class Result implements Serializable {

    private Integer id;
    private String name;
    private List<Occurrences> occurrences = new ArrayList<>();

    public void addOccurrence(Occurrences occurrence) {
        this.occurrences.add(occurrence);
    }
}

Después de la ejecución Drools, termino con una List<Result>. Convertido a JSON se parece a esto.

RESULTADO ACTUAL:

[
     {
        name: "Whatever"
        id: 0001,
        occurrences: [{
           (...)
        }]
    },
    {
        name: "Whatever"
        id: 0001,
        occurrences: [{
           (...)
        }]
    },
    {
        name: "Whatever"
        id: 0002,
        occurrences: [{
           (...)
        }]
    },
    {
        name: "Other thing"
        id: 0002,
        occurrences: [{
           (...)
        }]
    }
]

Necesito grupo a mi lista de Results por lo que el ocurrencesse agrupan por idy name, de esta manera.

GASTOS ESPERADOS:

[
    {
        name: "Whatever"
        id: 0001,
        occurrences: [{
           (...)
        }, {
           (...)
        }]
    },
    {
        name: "Whatever"
        id: 0002,
        occurrences: [{
           (...)
        }]
    },
    {
        name: "Other thing"
        id: 0002,
        occurrences: [{
           (...)
        }]
    }
]

¿Cuál sería la mejor forma de implementar esto? Tengo dos opciones:

  1. Cambio Drools rige por lo que mi List<Result>ya está estructurado el I necesidad manera. Tal vez crear una clase con un addResultmétodo que comprueba la lista de ide namey añadir la aparición de la entrada derecha. Pero esto no es lo ideal, ya que aumentará la complejidad dentro de las reglas.
  2. Post-procesar mi List<Result>por lo que los grupos de la occurrencesde idy name. Pero no tengo ni idea de cómo hacer esto de forma optimizada y simple.

¿Cuál es la mejor manera de hacer la segunda opción?

Etienne Miret:

Yo añadiría el siguiente método a Result:

Result addOccurrences (List<Occurrences> occurrences) {
  this.occurrences.addAll (occurrences);
  return this;
}

Y entonces se puede usar Streams:

List<Result> collect = results.stream ()
  .collect (Collectors.groupingBy (Result::getId, Collectors.groupingBy (Result::getName, Collectors.toList ())))
  .values ()
  .stream ()
  .map (Map::values)
  .flatMap (Collection::stream)
  .map (Collection::stream)
  .map (resultStream -> resultStream.reduce ((r0, r1) -> r0.addOccurrences (r1.getOccurrences ())))
  .filter (Optional::isPresent)
  .map (Optional::get)
  .collect (Collectors.toList ());

Supongo que te gusta

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