Tengo una lista de objetos. El objeto es el siguiente:
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;
...
}
Necesito encontrar los elementos que tengan el mismo agendaCode
, visitTypeCode
y scheduledTime
como para la vida de mí no puedo lograr que se haga.
He intentado esto:
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());
Pero no está haciendo lo que pensaba que sería. Lo ideal sería tener una lista de listas, donde cada sub-lista es una lista de ranuras de objetos que comparten la misma agendaCode
, visitTypeCode
y scheduledTime
. Lucha que con la programación funcional por lo que cualquier ayuda o punteros sería genial!
Esta es Java 11 y también estoy usando vavr.
Ya que menciona que está utilizando vavr, aquí es la forma vavr para resolver esta cuestión.
Se supone que tienes tu io.vavr.collection.List
(o Array
o Vector
o Stream
o una colección 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()
)
);
O con una java.util.List
de las 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()
)
)
);