如何从子集合中收集过滤器对象的列表

Kar*_*ton 4 java java-8 java-stream

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

Class LandResearch {
    Research research;
}

Class Research {
    List<Bonus> bonuses;
}

Class Bonus {
    BonusType bonusType;
    double bonusValue;
}
Run Code Online (Sandbox Code Playgroud)

我处于这种情况,当我有一个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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

感谢您的帮助和提示.

Era*_*ran 8

使用flatMap产生Stream的所有的Bonus情况,然后过滤,并收集到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>
Run Code Online (Sandbox Code Playgroud)