如何使用Java 8流编写以下片段代码。
我们有一个包含上一年度图书详细信息的列表,还有一个包含当前年度的图书详细信息的列表。我们需要合并两个清单以获得书的最终细节。需要将当年清单中的旧版书与上一年度清单进行比较,以确定这些书的价格。这两个列表之间的匹配标准是书号。而且我们不建议修改BookDetailsLastYear列表和BookDetailsCurrentYear列表。
public List<Books> determineLatestBookDetails(List<BookDetailsLastYear> lastYearDetails, List<BookDetailsCurrentYear> currentYearDetails) {
List<Books> booklist = new ArrayList<>();
for(BookDetailsLastYear bdly: lastYearDetails) {
if(bdly.getId() > 15) {
for(BookDetailsCurrentYear bdcy: currentYearDetails) {
if(!bdcy.getEdition().equals("current")) {
if(bdly.getId() == bdcy.getId()) {
Books book = new Books();
book.setId(bdly.getId());
if(bdly.getPrice() >= bdcy.getPrice()) {
book.setPrice(bdly.getPrice());
} else {
book.setPrice(bdcy.getPrice());
}
booklist.add(book);
}
}
}
}
}
return booklist;
}
答案 0 :(得分:2)
我不能保证您代码的正确性,因为您没有包含太多上下文,但这应该是准确的等效内容:
return lastYearDetails.stream()
.filter(bdly -> bdly.getId() > 15)
.flatMap(bdly -> currentYearDetails.stream()
.filter(bdcy -> !bdcy.getEdition().equals("current"))
.filter(bdcy -> bdcy.getId() == bdly.getId())
.map(bdcy -> {
Books book = new Books();
book.setId(bdly.getId());
book.setPrice(Math.max(bdly.getPrice(), bdcy.getPrice()));
return book;
}))
.collect(Collectors.toList());
答案 1 :(得分:0)
final List<Books> books = lastYearDetails.stream()
.filter(bdly -> bdly.getId() > 15)
.map(bdly -> new AbstractMap.SimpleImmutableEntry<>(
bdly,
currentYearDetails.stream()
.filter(bdcy -> !bdcy.getEdition().equals("current"))
.filter(bdcy -> bdcy.getId() == bdly.getId())
.findFirst()
))
.filter(pair -> pair.getValue().isPresent())
.map(pair -> {
Books book = new Books();
book.setId(pair.getKey().getId());
book.setPrice(Math.max(pair.getKey().getPrice(), pair.getValue().getPrice()));
return book;
})
.collect(Collectors.toList());