我正在尝试根据搜索查询搜索子节点。我还需要让他们的父母留在名单中。我正面临着迭代和过滤已经填充了父母和孩子的完整树的困难。 搜索查询将与以下类的nodeName属性匹配。
这是我的TreeNode类
public class TreeNodeDTO {
/** The id. */
private String id;
/** The nodeName. */
private String nodeName;
/** The children. */
private List<TreeNodeDTO> children;
//setters and getters
}
答案 0 :(得分:2)
您可以创建一个辅助方法,返回此节点的Stream<TreeNodeDTO>
及其后代(递归搜索),然后在流上搜索:
private Stream<TreeNodeDTO> descendants() {
return Stream.concat(
Stream.of(this),
children.stream().flatMap(TreeNodeDTO::descendants));
}
用法:
Optional<TreeNodeDTO> maybeNode = rootNode.descendants()
.filter(n -> n.nodeName.equals("something"))
.findFirst();
maybeNode.ifPresent(n -> /* do something with the found node */);
编辑1:
如果要检索满足搜索条件的许多节点,可以这样做:
List<TreeNodeDTO> results = rootNode.descendants()
.filter(n -> n.nodeName.equals("something"))
.collect(Collectors.toList());
编辑2:
要查找满足搜索条件的节点的父节点,请考虑在getParent()
类中添加返回父节点的TreeNodeDTO
方法。然后你可以按如下方式使用它:
List<TreeNodeDTO> parents = rootNode.descendants()
.filter(n -> n.nodeName.equals("something"))
.map(TreeNodeDTO::getParent)
.collect(Collectors.toList());