Nodelist Spliterator
package name.panitz.util.xml;
import java.util.Spliterator;
import java.util.function.Consumer;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class NodeListSpliterator implements Spliterator<Node>{
NodeList ns;
int start = 0;
int end;
public NodeListSpliterator(NodeList ns) {
this(ns,0,ns.getLength());
}
public NodeListSpliterator(NodeList ns, int start, int length) {
this.ns = ns;
this.start = start;
this.end = length;
}
Stream<Node> stream(){return StreamSupport.stream(this, false);}
Stream<Node> parallelStream(){return StreamSupport.stream(this, true);}
@Override
public boolean tryAdvance(Consumer<? super Node> action) {
if (start >= end) return false;
action.accept(ns.item(start++));
return true;
}
@Override
public NodeListSpliterator trySplit() {
if (end-start < 3) return null;
int middle = (end+start)/2;
int oldEnd = end;
end = middle;
return new NodeListSpliterator(ns, middle, oldEnd);
}
@Override
public long estimateSize() {
return end-start;
}
@Override
public int characteristics() {
// TODO Auto-generated method stub
return 0;
}
}