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