【发布时间】:2019-05-06 09:00:38
【问题描述】:
我有一个Terminal 对象:
class Terminal{
List<TerminalPeriodApplicability> periods= new ArrayList<>();
//few other attributes
//getters & setters
}
TerminalPeriodApplicability对象:
class TerminalPeriodApplicability{
String name;
boolean isRequired;
//getters & setters
}
我想根据isRequired 的值将TerminalPeriodApplicability 的名称分为optional 和mandatory Sets。
我尝试了两种方法。一个有两个forEach,另一个有flatMap。
List<Terminal> terminals= getTerminals();
Set<String> mandatoryPeriods = new HashSet<>();
Set<String> optionalPeriods = new HashSet<>();
方法一:
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());
});
我想知道哪种方法在时间和空间复杂性方面更有效。或者有没有更好的办法来解决这个问题?
【问题讨论】:
-
forEach方法可以简化为terminals.forEach(terminal -> terminal.getApplicablePeriods().forEach(period -> (period.getIsRequired()? mandatoryPeriods: optionalPeriods).add(period.name()) ));,不过,this answer 的 Stream 方法看起来更干净……
标签: java foreach java-8 java-stream