commit
fa87142efd
4 changed files with 40 additions and 7 deletions
|
@ -249,5 +249,12 @@ public interface Node<T> {
|
||||||
*
|
*
|
||||||
* @return a stream of all the nodes in the tree below this node
|
* @return a stream of all the nodes in the tree below this node
|
||||||
*/
|
*/
|
||||||
Stream<Node<T>> streamAll();
|
Stream<Node<T>> stream();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a stream of all the node's ancestor nodes.
|
||||||
|
*
|
||||||
|
* @return a stream of the node's parents recursively until the root node
|
||||||
|
*/
|
||||||
|
Stream<Node<T>> parentStream();
|
||||||
}
|
}
|
||||||
|
|
|
@ -371,8 +371,14 @@ class NodeItem<T> implements Node<T> {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Stream<Node<T>> streamAll() {
|
public Stream<Node<T>> stream() {
|
||||||
return Stream.concat(Stream.of(this), getChildren().stream()
|
return Stream.concat(Stream.of(this), getChildren().stream()
|
||||||
.flatMap(Node::streamAll));
|
.flatMap(Node::stream));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Stream<Node<T>> parentStream() {
|
||||||
|
return findParent().map(node -> Stream.concat(Stream.of(node), node.parentStream()))
|
||||||
|
.orElseGet(Stream::empty);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -437,14 +437,14 @@ public class ImmutableNodeItemTest {
|
||||||
Nodes.namedChild("eight", "eight", n6);
|
Nodes.namedChild("eight", "eight", n6);
|
||||||
val immutableRoot = Nodes.asImmutable(node);
|
val immutableRoot = Nodes.asImmutable(node);
|
||||||
//when
|
//when
|
||||||
val result = immutableRoot.streamAll()
|
val result = immutableRoot.stream()
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
//then
|
//then
|
||||||
assertThat(result).as("full tree")
|
assertThat(result).as("full tree")
|
||||||
.hasSize(9);
|
.hasSize(9);
|
||||||
// and
|
// and
|
||||||
assertThat(immutableRoot.getChild("one")
|
assertThat(immutableRoot.getChild("one")
|
||||||
.streamAll()
|
.stream()
|
||||||
.collect(Collectors.toList())).as("sub-tree")
|
.collect(Collectors.toList())).as("sub-tree")
|
||||||
.hasSize(4);
|
.hasSize(4);
|
||||||
}
|
}
|
||||||
|
|
|
@ -920,13 +920,13 @@ public class NodeItemTest {
|
||||||
val n7 = Nodes.namedChild("seven", "seven", n5);
|
val n7 = Nodes.namedChild("seven", "seven", n5);
|
||||||
val n8 = Nodes.namedChild("eight", "eight", n6);
|
val n8 = Nodes.namedChild("eight", "eight", n6);
|
||||||
//when
|
//when
|
||||||
val result = node.streamAll()
|
val result = node.stream()
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
//then
|
//then
|
||||||
assertThat(result).as("full tree")
|
assertThat(result).as("full tree")
|
||||||
.contains(node, n1, n2, n3, n4, n5, n6, n7, n8);
|
.contains(node, n1, n2, n3, n4, n5, n6, n7, n8);
|
||||||
// and
|
// and
|
||||||
assertThat(n1.streamAll()
|
assertThat(n1.stream()
|
||||||
.collect(Collectors.toList())).as("sub-tree")
|
.collect(Collectors.toList())).as("sub-tree")
|
||||||
.containsExactlyInAnyOrder(n1, n3, n5, n7);
|
.containsExactlyInAnyOrder(n1, n3, n5, n7);
|
||||||
}
|
}
|
||||||
|
@ -945,4 +945,24 @@ public class NodeItemTest {
|
||||||
assertThat(Nodes.unnamedChild(null, root)
|
assertThat(Nodes.unnamedChild(null, root)
|
||||||
.isRoot()).isFalse();
|
.isRoot()).isFalse();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void parentStream() {
|
||||||
|
//given
|
||||||
|
val root = Nodes.namedRoot("root data", "root");
|
||||||
|
val child1 = Nodes.namedChild("child 1 data", "child 1", root);
|
||||||
|
val child2 = Nodes.namedChild("child 2 data", "child 2", root);
|
||||||
|
val child3 = Nodes.namedChild("child 3 data", "child 3", child2);
|
||||||
|
//when
|
||||||
|
val resultRoot = root.parentStream()
|
||||||
|
.collect(Collectors.toSet());
|
||||||
|
val resultChild1 = child1.parentStream()
|
||||||
|
.collect(Collectors.toSet());
|
||||||
|
val resultChild3 = child3.parentStream()
|
||||||
|
.collect(Collectors.toSet());
|
||||||
|
//then
|
||||||
|
assertThat(resultRoot).isEmpty();
|
||||||
|
assertThat(resultChild1).containsExactlyInAnyOrder(root);
|
||||||
|
assertThat(resultChild3).containsExactlyInAnyOrder(child2, root);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue