Filtro de objetos a partir de uma lista que tem o mesmo membro

coco :

Eu tenho uma lista de objetos. O objeto parece com isso:

public class Slots {
  String slotType;
  Visits visit;
}


public class Visits {
  private long visitCode;
  private String agendaCode;
  private String scheduledTime;
  private String resourceType;
  private String resourceDescription;
  private String visitTypeCode;
  ...
}

Eu preciso encontrar os elementos que têm o mesmo agendaCode, visitTypeCodee scheduledTimee para a vida de mim eu não posso fazê-lo.

Eu tentei isso:

Set<String> agendas = slotsResponse.getContent().stream()
    .map(Slots::getVisit)
    .map(Visits::getAgendaCode)
    .collect(Collectors.toUnmodifiableSet());

Set<String> visitTypeCode = slotsResponse.getContent().stream()
    .map(Slots::getVisit)
    .map(Visits::getVisitTypeCode)
    .collect(Collectors.toUnmodifiableSet());

Set<String> scheduledTime = slotsResponse.getContent().stream()
    .map(Slots::getVisit)
    .map(Visits::getScheduledTime)
    .collect(Collectors.toUnmodifiableSet());

List<Slots> collect = slotsResponse.getContent().stream()
    .filter(c -> agendas.contains(c.getVisit().getAgendaCode()))
    .filter(c -> visitTypeCode.contains(c.getVisit().getVisitTypeCode()))
    .filter(c -> scheduledTime.contains(c.getVisit().getScheduledTime()))
    .collect(Collectors.toList());

Mas ele não está fazendo o que eu pensava que seria. Idealmente, eu teria uma lista de listas, onde cada sub-lista é uma lista de Slots objetos que compartilham o mesmo agendaCode, visitTypeCodee scheduledTime. Luta I com programação funcional por isso qualquer ajuda ou ponteiros seria ótimo!

Esta é Java 11 e eu também estou usando vavr.

Belgrado Predecessor Black:

Desde que você mencionou que você está usando vavr, aqui é a maneira vavr para resolver esta questão.

Suposto você tem o seu io.vavr.collection.List(ou Arrayou Vectorou Streamou cobrança vavr similar) de visitas:

List<Visits> visits = ...;

final Map<Tuple3<String, String, String>, List<Visits>> grouped =
    visits.groupBy(visit ->
        Tuple.of(
            visit.getAgendaCode(),
            visit.getVisitTypeCode(),
            visit.getScheduledTime()
        )
    );

Ou com uma java.util.Listdas visitas:

List<Visits> visits = ...;

Map<Tuple3<String, String, String>, List<Visits>> grouped = visits.stream().collect(
    Collectors.groupingBy(
        visit ->
            Tuple.of(
                visit.getAgendaCode(),
                visit.getVisitTypeCode(),
                visit.getScheduledTime()
            )
    )
);

Acho que você gosta

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