Hi Kasper,

If what you're looking for is a more immediate solution, I can think of a
couple of libraries which may do the trick:

   1. Durian <https://github.com/diffplug/durian>'s TreeDef and TreeStream.
   Difficult to understand and use at first, but I believe it ticks a good
   number of boxes for you.
   2. Guava 21 <https://github.com/google/guava/wiki/Release21>'s
   `TreeTraverser` with the library's new Java 8 support. For example,

   
`Streams.stream(TreeTraverser.using(Node::getChildNodes).{preOrder|postOrder|breadthFirst}Traversal(rootNode));`

Both of these solutions allow depth- and breadth-first traversals (the
Guava solution allows both preOrder and postOrder depth traversals), but
it's not clear to me if either of them allows you to set a maximum depth to
traverse into.

Hope this helps.

Best regards,
Jonathan

On 20 January 2017 at 15:00, Remi Forax <fo...@univ-mlv.fr> wrote:

> https://gist.github.com/forax/bca6877e019d134f87c4cb1e8efae9cd
>
> Rémi
>
> ----- Mail original -----
> > De: "Kasper Nielsen" <kaspe...@gmail.com>
> > À: "core-libs-dev" <core-libs-dev@openjdk.java.net>
> > Envoyé: Vendredi 20 Janvier 2017 11:03:41
> > Objet: Stream based API for tree like structures
>
> > Hi,
> >
> > Sorry if this is a bit off-topic, but I thought but I thought it might
> have
> > some general interest if Java ever got some proper tree/graph collection
> > classes.
> >
> > Has anyone developed a stream based API that allows for tree based
> travels.
> > I'm mainly thinking about functionality for
> >
> > 1)
> > Whether or not to do recursive traversal of all child nodes, only 1 level
> > of child nodes, or just siblings
> >
> > 2)
> > Order of traversal: depth/breadth first.
> >
> > I'm trying to avoid an explosion of methods such as
> > streamSieblingsDepthOrderFirst.
> > One thought I had was taking a var arg of options to stream and
> > parallelStream such as:
> > enum TreeStreamOptions {
> >   SIEBLINGS_ONLY, RECURSIVELY, DEPTH_FIRST, BREATH_FIRST;
> > }
> > Stream<T> stream(TreeStreamOptions... options)
> > Stream<T> parallelStream(TreeStreamOptions... options)
> >
> > another one could be
> >
> > class TreeStreamOptions {
> >   TreeStreamOptions setDepthFirst();
> >   TreeStreamOptions setBreathFirst();
> >   TreeStreamOptions setDepth(); (0 sieblings only, Integer.MAX->infinity)
> > }
> > Stream<T> stream(TreeStreamOptions options)
> > Stream<T> parallelStream(TreeStreamOptions options)
> >
> > While a visitor pattern would make sense for many use cases. I really
> like
> > the simplicity of just working with streams.
> >
> > Maybe someone has some thoughts on this.
> >
> > Best
> >   Kasper
>

Reply via email to