从列表中筛选具有相同成员的对象

coc*_*nut 5 java functional-programming java-stream vavr

我有一个对象列表.该对象如下所示:

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;
  ...
}
Run Code Online (Sandbox Code Playgroud)

我需要找到具有相同元素的元素agendaCode,visitTypeCode并且scheduledTime在我的生活中我无法完成它.

我试过这个:

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());
Run Code Online (Sandbox Code Playgroud)

但它没有做我想的那样.理想情况下,我会有一个列表列表,其中每个子列表是共享相同的Slots对象的列表agendaCode,visitTypeCodescheduledTime.我努力学习函数式编程,所以任何帮助或指针都会很棒!

这是Java 11,我也在使用vavr.

Nán*_*ete 3

既然您提到您正在使用 vavr,那么这是解决此问题的 vavr 方法。

假设您有io.vavr.collection.List(或ArrayVectorStream或类似的 vavr 集合)访问次数:

List<Visits> visits = ...;

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

或者访问次数java.util.List

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()
            )
    )
);
Run Code Online (Sandbox Code Playgroud)