@Override public Stream<NodeBuilder> search(final boolean recursive, final NodePredicate criterium) { final NodeBuilder currentItem = this; Iterable<NodeBuilder> i = (new Iterable<NodeBuilder>() { private Iterator<NodeBuilder> iterator = new BaseRecursiveIterator<NodeBuilder>(new ChildrenAccessor<NodeBuilder>() { @Override public List<NodeBuilder> getChildren(NodeBuilder currentItem) { return currentItem.getChildren(); } }, criterium, recursive, currentItem); @Override public Iterator<NodeBuilder> iterator() { return iterator; } }); return StreamSupport.stream(i.spliterator(), false); }
protected Iterator<T> getChildren() { return this.childrenAccessor.getChildren(getCurrentItem()).iterator(); } @Override
@Override public T next() { if (hasNext()) { index = nextIndex; searched = false; if (hasChildIterator) { return childIterator.next(); } else { return currentItem; } } return null; }
return true; if (currentItemIterator == null) currentItemIterator = getChildren(); while (currentItemIterator.hasNext()) { currentItem = currentItemIterator.next(); if (recursive) { childIterator = new BaseRecursiveIterator<T>(childrenAccessor, criterium, recursive, currentItem); if (childIterator.hasNext()) { searched = true;
public static void main(String[] args) { l.setLevel(Level.FINEST); Node n = new Node(); n.add("s").add("b").add("c"); BaseRecursiveIterator<Node> b = new BaseRecursiveIterator<Node>(new ChildrenAccessor<Node>() { @Override public Iterable<Node> getChildren(Node currentItem) { l.finest("getting children"); return currentItem.getNodes(); } }, new Predicate<Node>() { @Override public boolean test(Node t) { l.fine("exec " + t.getName()); return "x".equals(t.getName()); } }, true, n); b.next(); Log.get(); } }