#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. Идеально! просто добавил нулевую проверку, и это сработало! Большое спасибо!