首页 > 解决方案 > 如何从子集合中收集过滤对象列表

问题描述

让我们有数据结构,如下所述。

Class LandResearch {
    Research research;
}

Class Research {
    List<Bonus> bonuses;
}

Class Bonus {
    BonusType bonusType;
    double bonusValue;
}

我的情况是,当我有一个List<LandResearch>并且我有特定的BonusType. 我想收集所有的奖金,这给了BonusType

用循环来做这件事不是问题,但我想用流来管理它。

现有的解决方案,我想替换它。

List<Bonus> bonuses = new ArrayList<>();
for (LandResearch landResearch: landResearches) {
    for (Bonus bonus: landResearch.getResearch().getBonuses()){
        if (bonus.getBonusType().equals(searchedBonusType)){
            bonuses.add(bonus);
        }
    }
}

感谢您的帮助和提示。

标签: javajava-8java-stream

解决方案


用于flatMap生成Stream所有Bonus实例中的 a ,然后过滤并收集到 a List

List<Bonus> bonuses =
    landResearches.stream() // Stream<LandResearch>
                  .flatMap(l->l.getResearch().getBonuses().stream()) // Stream<Bonus>
                  .filter(b->b.getBonusType().equals(searchedBonusType)) // Stream<Bonus>
                  .collect(Collectors.toList()); // List<Bonus>

推荐阅读