如何使用java 8 streams编写下面的代码。
我们有一个包含去年图书详细信息的列表和另一个包含本年度图书详细信息的列表。我们需要合并两个列表才能得到书的最终细节。本年度列表中的旧版图书需要与上一年度列表进行比较,以确定这些图书的价格。两个列表之间的匹配crietria是图书id。并且我们不应该修改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;
}
发布于 2018-07-26 05:09:58
我不能保证你的代码的正确性,因为你没有包含太多的上下文,但这应该是一个准确的等价物:
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());
发布于 2018-07-26 18:42:21
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());
https://stackoverflow.com/questions/51527543
复制相似问题