如何基于Java 8中的匹配条件从2个不同的对象列表创建对象列表

时间:2018-07-25 20:58:02

标签: java loops java-8 nested java-stream

如何使用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;
}

2 个答案:

答案 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());