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
, visitTypeCode
e scheduledTime
e 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
, visitTypeCode
e 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.
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 Array
ou Vector
ou Stream
ou 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.List
das 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()
)
)
);