遍历链接对象
Traverse through linked objects
我有这个对象,其中每个规则存储一个规则列表:
public class Rule {
private String name;
private String condition;
private List<String> result;
private List<Rule> rules;
private Map<String, List<String>> aliases = Maps.newHashMap();
private boolean last = false;
}
遍历所有链接对象并将所有“结果”字段插入列表(无论它们来自哪个对象)的最聪明、最有效的方法是什么?最后我想要一个列表:
List<String> results
包含所有对象的所有结果。
我已经尝试了几个小时,非常感谢你的帮助。获取所有对象本身的列表也对我有帮助,例如压平树。
您可以使用流
这是我将规则列表映射到结果流的递归版本
private Stream<String> mapToRules(List<Rule> rules) {
return Stream.concat(rules.stream()
.map(Rule::getResult)
.flatMap(List::stream),
rules.stream()
.map(Rule::getRules)
.flatMap(this::mapToRules));
}
单根版本
private Stream<String> mapToRules(Rule rule) {
return Stream.concat(rule
.getResult()
.stream(),
rule.getRules()
.stream()
.flatMap(this::mapToRules));
}
然后您可以将此流收集到列表中
mapToRules(list).collect(Collectors.toList());
我有这个对象,其中每个规则存储一个规则列表:
public class Rule {
private String name;
private String condition;
private List<String> result;
private List<Rule> rules;
private Map<String, List<String>> aliases = Maps.newHashMap();
private boolean last = false;
}
遍历所有链接对象并将所有“结果”字段插入列表(无论它们来自哪个对象)的最聪明、最有效的方法是什么?最后我想要一个列表:
List<String> results
包含所有对象的所有结果。
我已经尝试了几个小时,非常感谢你的帮助。获取所有对象本身的列表也对我有帮助,例如压平树。
您可以使用流
这是我将规则列表映射到结果流的递归版本
private Stream<String> mapToRules(List<Rule> rules) {
return Stream.concat(rules.stream()
.map(Rule::getResult)
.flatMap(List::stream),
rules.stream()
.map(Rule::getRules)
.flatMap(this::mapToRules));
}
单根版本
private Stream<String> mapToRules(Rule rule) {
return Stream.concat(rule
.getResult()
.stream(),
rule.getRules()
.stream()
.flatMap(this::mapToRules));
}
然后您可以将此流收集到列表中
mapToRules(list).collect(Collectors.toList());