ネストされたオブジェクトリストの二股一覧への効率的な方法はどれですか?それぞれの対のJava 8 flatmap?

AshwinK:

私はしましたTerminalオブジェクトを:

class Terminal{

    List<TerminalPeriodApplicability> periods= new ArrayList<>();
    //few other attributes

    //getters & setters

}

TerminalPeriodApplicability オブジェクト:

class TerminalPeriodApplicability{

    String name;
    boolean isRequired;
    //getters & setters
}

私は二股の名前にしたいTerminalPeriodApplicabilityoptionalmandatory Setにs系isRequiredの値。

私はそれの二つのアプローチを試みました。2と一つforEachとして、他のflatMap

List<Terminal> terminals= getTerminals();
Set<String> mandatoryPeriods = new HashSet<>();
Set<String> optionalPeriods = new HashSet<>();

アプローチ1

terminals.forEach(terminal -> terminal.getApplicablePeriods().forEach(period->{
    if(period.getIsRequired())
        mandatoryPeriods.add(period.name());
    else
        optionalPeriods.add(period.name());
}));

アプローチ2:

List<TerminalPeriodApplicability> applicablePeriods = terminals
                .stream()
                .flatMap(terminal -> terminal.getApplicablePeriods().stream())
                .collect(Collectors.toList());

applicablePeriods.forEach(period->{
    if(period.getIsRequired())
        mandatoryPeriods.add(period.name());
    else
        optionalPeriods.add(period.name());
});

私は、時間と空間計算量の点でより効率的であるアプローチ知っていただきたいと思います。または、この問題を解決するための任意のより良い解決策はありますか?

彼らは次のとおりでした:

あなたは、あなたの中でさまざまな端末操作を使用することができますflatMap-バージョンpartitioningByの代わりにtoList-第二を避けますforEach

Map<Boolean,List<TerminalPeriodApplicability>> periods = terminals
            .stream()
            .flatMap(terminal -> terminal.getApplicablePeriods().stream())
            .collect(Collectors.partitioningBy(TerminalPeriodApplicability::getIsRequired);

若しくは

Map<Boolean,Set<TerminalPeriodApplicability>> periods = terminals
            .stream()
            .flatMap(terminal -> terminal.getApplicablePeriods().stream())
            .collect(Collectors.partitioningBy(TerminalPeriodApplicability::getIsRequired,
                                               Collectors.toSet());

訂正:あなたは2たいのでSet収容するためのString代わりのsのTerminalPeriodApplicabilityインスタンスを、それは次のようになります。

Map<Boolean,Set<String>> periods = terminals
            .stream()
            .flatMap(terminal -> terminal.getApplicablePeriods().stream())
            .collect(Collectors.partitioningBy(TerminalPeriodApplicability::getIsRequired,
                                               Collectors.mapping(TerminalPeriodApplicability::name,
                                                                  Collectors.toSet()));

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=337611&siteId=1