在 java 中创建自定义收集器

Create custom collector in java

我有两个 类 会议和访客。

关系如下所示:

class Meeting {

private LocalDate date;
private List<Guest> guests;

}

我需要使用流媒体按日期和客人来自美国的地点获得一场会议。

我有 List,我已经完成了下一个:

List<Meeting> meetings = new ArrayList<>();

public Meeting getByDay(LocalDate date) {
    List<Guest> guests = getGuestsByDate(date).stream()
            .filter(guest-> guest.getCountry().equals("USA"))
            .collect(Collectors.toList());
    return new Meeting(date, guests);
}

但现在我需要使用自定义收集器重构我的代码,returns 会议。 我读到它需要实现 Collector 接口或 Collector.of() 方法,但在我的情况下它必须看起来如何?如果有任何建议,我将不胜感激。

我知道这不是完整的代码,但您会了解如何实现解决方案

 List<Meeting> meeting = meetings.stream()
        .filter(guest-> guest.getCountry().equals("USA"))
        .map(v->{ 
          return new Meeting(something, something);
         })
        .collect(Collectors.toList());

我不推荐这种方法,但如果你需要,你可以使用:

    Meeting m = Stream.of(new Guest(), new Guest())
        .collect(Collector.of(
            () -> new Meeting(date),
            Meeting::addGuest,
            (m1, m2) -> {
              ArrayList<Guest> guestsAll = new ArrayList<>(m1.getGuests());
              guestsAll.addAll(m2.getGuests());
              return new Meeting(date, guestsAll);
            }
        ));

我向 Meeting class

添加了几个构造函数和方法
    Meeting(LocalDate date) {
      this.date = date;
      this.guests = new ArrayList<>();
    }

    Meeting(LocalDate date, List<Guest> guests) {
      this.date = date;
      this.guests = guests;
    }

    public void addGuest(Guest g) {
      guests.add(g);
    }

虽然问题是关于使用 Collector,但您也可以使用 reduce 运算符。试试下面的代码:

public Meeting getByDay(LocalDate date) {   
    return getGuestsByDate(date).stream()
            .filter(guest -> guest.getCountry().equals("USA"))
            .reduce(new Meeting(date, new ArrayList<>()), (meeting, guest) -> {
                meeting.guests.add(guest);
                return meeting;
            }, (meeting1, meeting2) -> {
                meeting1.guests.addAll(meeting2.guests);
                return meeting1;
            });
}

您可以将这些 lambda 表达式转移到 Meeting class 或其他一些方法中,并使用方法参考或一个线性 lambda。