在 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。
我有两个 类 会议和访客。
关系如下所示:
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。