Search code examples
javajava-streamcollectors

Create custom collector in java


I have two classes Meeting and Guest.

The relation looks like this:

class Meeting {

private LocalDate date;
private List<Guest> guests;

}

I need to get one Meeting by date and where guests are from the USA using stream.

I have List and I have done the next one:

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);
}

but now I need to refactor my code with custom Collector, which returns Meeting. I read it needs to implement the Collector interface or Collector.of() method but how it must look in my case? I would be grateful for any advice.


Solution

  • I don't recommend this approach, but if you need, you can use:

        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);
                }
            ));
    
    

    I added couple of constructors and method to 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);
        }