我有一个 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
Set
我已经尝试了两种方法。一个有两个 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());
更正:由于您希望两个 Set
包含 String
而不是 TerminalPeriodApplicability
实例,因此它应该是:
Map<Boolean,Set<String>> periods = terminals
.stream()
.flatMap(terminal -> terminal.getApplicablePeriods().stream())
.collect(Collectors.partitioningBy(TerminalPeriodApplicability::getIsRequired,
Collectors.mapping(TerminalPeriodApplicability::name,
Collectors.toSet()));
关于java - 哪个是 fork 嵌套对象列表列表的有效方法? java 8平面图与每个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56001904/