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

时间:2018-08-15 07:11:06

标签: java java-8 java-stream

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

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

感谢您的帮助和提示。

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

如果您选择kotlin

private fun Collection<LandResearch>.bonuses(wanted: BonusType): List<Bonus> =
        flatMap { it.research.bonuses }.filter { it.bonusType == wanted }

像这样使用它:

val bonusesOfWantedType = listOfLandSearches.bonuses(wantedBonusType)