AshwinK:
私はしましたTerminal
オブジェクトを:
class Terminal{
List<TerminalPeriodApplicability> periods= new ArrayList<>();
//few other attributes
//getters & setters
}
TerminalPeriodApplicability
オブジェクト:
class TerminalPeriodApplicability{
String name;
boolean isRequired;
//getters & setters
}
私は二股の名前にしたいTerminalPeriodApplicability
にoptional
&mandatory
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()));