Перемещение по связанным объектам

#java #json #tree #traversal

Вопрос:

У меня есть этот объект, где каждое правило хранит список правил:

 public class Rule {   private String name;  private String condition;  private Listlt;Stringgt; result;  private Listlt;Rulegt; rules;  private Maplt;String, Listlt;Stringgt;gt; aliases = Maps.newHashMap();  private boolean last = false;  }  

Каков самый умный и эффективный способ просмотреть все связанные объекты и вставить все поля «результаты» в список, независимо от объекта, с которого они были получены? в конце концов, я хотел бы иметь список:

Listlt;Stringgt; results содержащий все результаты от всех объектов.

Я пытаюсь уже несколько часов и был бы признателен вам за помощь. Получить список всех самих объектов мне также поможет, например, расплющить дерево.

Комментарии:

1. Могут ли результаты содержать ссылки на себя?

2. нет, они этого не делают

Ответ №1:

Вы можете использовать потоки

Вот моя рекурсивная версия для сопоставления списка правил с потоком результатов

 private Streamlt;Stringgt; mapToRules(Listlt;Rulegt; rules) {  return Stream.concat(rules.stream()  .map(Rule::getResult)  .flatMap(List::stream),  rules.stream()  .map(Rule::getRules)  .flatMap(this::mapToRules));  }  

Версия для одного корня

 private Streamlt;Stringgt; mapToRules(Rule rule) {  return Stream.concat(rule  .getResult()  .stream(),  rule.getRules()  .stream()  .flatMap(this::mapToRules));  }  

Затем вы можете собрать этот поток в список

 mapToRules(list).collect(Collectors.toList());  

Комментарии:

1. Спасибо, у меня есть корневое правило, могу ли я перенести исходный список правил, принадлежащих этому корню, в качестве исходного списка? потому что это не работает 🙁

2. Вы можете использовать mapToRules(List.of(root)) .

3. Идеально! просто добавил нулевую проверку, и это сработало! Большое спасибо!