【问题标题】:How to create a list of Object by from 2 different list of objects based on a matching criteria in java 8如何根据java 8中的匹配条件从2个不同的对象列表中创建对象列表
【发布时间】:2018-07-25 20:58:01
【问题描述】:

如何使用 java 8 流编写下面的代码。

我们有一个包含去年书籍详细信息的列表和另一个包含当年书籍详细信息的列表。我们需要合并两个列表来获得书的最终细节。需要将当年列表中较旧版本的书籍与上一年列表进行比较以确定这些书籍的价格。两个列表之间的匹配条件是书籍 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;
}

【问题讨论】:

  • 你尝试了什么?
  • 除非一个实例代表多个对象,否则不应以复数形式命名一个类。
  • @shmosel 这对于非英语为母语的人来说很常见。在我的项目中,人们会写类似 simular、cross-sell、crosssale、variation-axis 之类的东西,而你对此无能为力……
  • @Wow 除了告诉人们你的意思。
  • @Naresh,我认为您的代码逻辑有很大缺陷,因为您需要检查当年的书籍在版本字段中是否有“当前”。

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


【解决方案1】:

我无法保证您的代码的正确性,因为您没有包含太多上下文,但这应该是一个准确的等价物:

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

【讨论】:

  • @Wow 感谢您的快速响应,代码运行良好。这里给出的用例不是我的实际用例,它与我正在研究的用例相似。所以真的没想太多逻辑。
【解决方案2】:
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());

【讨论】:

    猜你喜欢
    • 2019-12-13
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多