Package io.vavr.collection
Class Tree.Node<T>
java.lang.Object
io.vavr.collection.Tree.Node<T>
- Type Parameters:
T
- value type
- All Implemented Interfaces:
Foldable<T>
,Traversable<T>
,Tree<T>
,Value<T>
,Serializable
,Iterable<T>
Represents a tree node.
- See Also:
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionprivate static final class
A serialization proxy which, in this context, is used to deserialize immutable nodes with final instance fields.Nested classes/interfaces inherited from interface io.vavr.collection.Tree
Tree.Empty<T>, Tree.Node<T>, Tree.Order
-
Field Summary
Fields -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptiondraw()
Creates a neat 2-dimensional drawing of a tree.private void
drawAux
(String indent, StringBuilder builder) boolean
In Vavr there are four basic classes of collections: Seq (sequential elements) Set (distinct elements) Map (indexed elements) Multimap (indexed collections) Two collection instances of these classes are equal if and only if both collections belong to the same basic collection class (Seq, Set, Map or Multimap) contain the same elements have the same element order, if the collections are of type Seq Two Map/Multimap elements, resp.Returns the children of this tree.getValue()
Gets the value of this tree.int
hashCode()
Returns the hash code of this collection.boolean
isEmpty()
Checks if this Traversable is empty.boolean
isLeaf()
Checks if this Tree is a leaf.last()
Dual of Traversable.head(), returning the last element.int
length()
Computes the number of elements of this Traversable.private void
readObject
(ObjectInputStream stream) readObject
method for the serialization proxy pattern.Creates a Lisp-like representation of thisTree
.private static String
toLispString
(Tree<?> tree) toString()
Clarifies that values have a proper toString() method implemented.private Object
writeReplace
method for the serialization proxy pattern.Methods inherited from class java.lang.Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait
Methods inherited from interface io.vavr.collection.Foldable
fold, reduce, reduceOption
Methods inherited from interface io.vavr.collection.Traversable
arrangeBy, average, containsAll, count, existsUnique, find, findLast, foldLeft, forEachWithIndex, get, headOption, isOrdered, isSingleValued, lastOption, max, maxBy, maxBy, min, minBy, minBy, mkCharSeq, mkCharSeq, mkCharSeq, mkString, mkString, mkString, nonEmpty, product, reduceLeft, reduceLeftOption, reduceRight, reduceRightOption, single, singleOption, size, spliterator, sum
Methods inherited from interface io.vavr.collection.Tree
branchCount, collect, distinct, distinctBy, distinctBy, drop, dropRight, dropUntil, dropWhile, filter, flatMap, foldRight, groupBy, grouped, hasDefiniteSize, head, init, initOption, isAsync, isBranch, isDistinct, isLazy, isSequential, isTraversableAgain, iterator, iterator, leafCount, map, nodeCount, orElse, orElse, partition, peek, reject, replace, replaceAll, retainAll, scan, scanLeft, scanRight, slideBy, sliding, sliding, span, stringPrefix, tail, tailOption, take, takeRight, takeUntil, takeWhile, transform, traverse, traverse, unzip, unzip3, values, values, zip, zipAll, zipWith, zipWithIndex, zipWithIndex
Methods inherited from interface io.vavr.Value
collect, collect, contains, corresponds, eq, exists, forAll, forEach, getOrElse, getOrElse, getOrElseThrow, getOrElseTry, getOrNull, out, out, stderr, stdout, toArray, toCharSeq, toCompletableFuture, toEither, toEither, toInvalid, toInvalid, toJavaArray, toJavaArray, toJavaArray, toJavaCollection, toJavaList, toJavaList, toJavaMap, toJavaMap, toJavaMap, toJavaOptional, toJavaParallelStream, toJavaSet, toJavaSet, toJavaStream, toLeft, toLeft, toLinkedMap, toLinkedMap, toLinkedSet, toList, toMap, toMap, toOption, toPriorityQueue, toPriorityQueue, toQueue, toRight, toRight, toSet, toSortedMap, toSortedMap, toSortedMap, toSortedMap, toSortedSet, toSortedSet, toStream, toTree, toTree, toTry, toTry, toValid, toValid, toValidation, toValidation, toVector
-
Field Details
-
serialVersionUID
private static final long serialVersionUID- See Also:
-
value
-
children
-
size
private final int size
-
-
Constructor Details
-
Node
Constructs a rose tree branch.- Parameters:
value
- A value.children
- A non-empty list of children.- Throws:
NullPointerException
- if children is nullIllegalArgumentException
- if children is empty
-
-
Method Details
-
getChildren
Description copied from interface:Tree
Returns the children of this tree.- Specified by:
getChildren
in interfaceTree<T>
- Returns:
- the tree's children
-
getValue
Description copied from interface:Tree
Gets the value of this tree. -
isEmpty
public boolean isEmpty()Description copied from interface:Traversable
Checks if this Traversable is empty. -
length
public int length()Description copied from interface:Traversable
Computes the number of elements of this Traversable.Same as
Traversable.size()
.- Specified by:
length
in interfaceTraversable<T>
- Returns:
- the number of elements
-
isLeaf
public boolean isLeaf()Description copied from interface:Tree
Checks if this Tree is a leaf. A tree is a leaf if it is a Node with no children. Because the empty tree is no Node, it is not a leaf by definition. -
last
Description copied from interface:Traversable
Dual of Traversable.head(), returning the last element.- Specified by:
last
in interfaceTraversable<T>
- Returns:
- the last element.
-
equals
Description copied from interface:Traversable
In Vavr there are four basic classes of collections:- Seq (sequential elements)
- Set (distinct elements)
- Map (indexed elements)
- Multimap (indexed collections)
- belong to the same basic collection class (Seq, Set, Map or Multimap)
- contain the same elements
- have the same element order, if the collections are of type Seq
Notes:
- No collection instance equals null, e.g. Queue(1) not equals null.
- Nulls are allowed and handled as expected, e.g. List(null, 1) equals Stream(null, 1) and HashMap((null, 1)) equals LinkedHashMap((null, 1)).
- The element order is taken into account for Seq only. E.g. List(null, 1) not equals Stream(1, null) and HashMap((null, 1), ("a", null)) equals LinkedHashMap(("a", null), (null, 1)). The reason is, that we do not know which implementations we compare when having two instances of type Map, Multimap or Set (see Liskov Substitution Principle).
- Other collection classes are equal if their types are equal and their elements are equal (in iteration order).
- Iterator equality is defined to be object reference equality.
- Specified by:
equals
in interfaceTraversable<T>
- Specified by:
equals
in interfaceTree<T>
- Specified by:
equals
in interfaceValue<T>
- Overrides:
equals
in classObject
- Parameters:
o
- an object, may be null- Returns:
- true, if this collection equals the given object according to the rules described above, false otherwise.
-
hashCode
public int hashCode()Description copied from interface:Traversable
Returns the hash code of this collection.
We distinguish between two types of hashes, those for collections with predictable iteration order (like Seq) and those with arbitrary iteration order (like Set, Map and Multimap).
In all cases the hash of an empty collection is defined to be 1.
Collections with predictable iteration order are hashed as follows:
Collections with arbitrary iteration order are hashed in a way such that the hash of a fixed number of elements is independent of their iteration order.int hash = 1; for (T t : this) { hash = hash * 31 + Objects.hashCode(t); }
Please note that the particular hashing algorithms may change in a future version of Vavr.int hash = 1; for (T t : this) { hash += Objects.hashCode(t); }
Generally, hash codes of collections aren't cached in Vavr (opposed to the size/length). Storing hash codes in order to reduce the time complexity would increase the memory footprint. Persistent collections are built upon tree structures, it allows us to implement efficient memory sharing. A drawback of tree structures is that they make it necessary to store collection attributes at each tree node (read: element).
The computation of the hash code is linear in time, i.e. O(n). If the hash code of a collection is re-calculated often, e.g. when using a List as HashMap key, we might want to cache the hash code. This can be achieved by simply using a wrapper class, which is not included in Vavr but could be implemented like this:public final class Hashed<K> { private final K key; private final Lazy<Integer> hashCode; public Hashed(K key) { this.key = key; this.hashCode = Lazy.of(() -> Objects.hashCode(key)); } public K key() { return key; } @Override public boolean equals(Object o) { if (o == key) { return true; } else if (key != null && o instanceof Hashed) { final Hashed that = (Hashed) o; return key.equals(that.key); } else { return false; } } @Override public int hashCode() { return hashCode.get(); } @Override public String toString() { return "Hashed(" + (key == null ? "null" : key.toString()) + ")"; } }
-
toString
Description copied from interface:Value
Clarifies that values have a proper toString() method implemented.See Object.toString().
-
toLispString
Description copied from interface:Tree
Creates a Lisp-like representation of thisTree
.- Specified by:
toLispString
in interfaceTree<T>
- Returns:
- This
Tree
as Lisp-string, i.e. represented as list of lists.
-
draw
Description copied from interface:Tree
Creates a neat 2-dimensional drawing of a tree. Unicode characters are used to draw node junctions. -
drawAux
-
toLispString
-
writeReplace
@GwtIncompatible("The Java serialization protocol is explicitly not supported") private Object writeReplace()writeReplace
method for the serialization proxy pattern.The presence of this method causes the serialization system to emit a SerializationProxy instance instead of an instance of the enclosing class.
- Returns:
- A SerializationProxy for this enclosing class.
-
readObject
@GwtIncompatible("The Java serialization protocol is explicitly not supported") private void readObject(ObjectInputStream stream) throws InvalidObjectException readObject
method for the serialization proxy pattern.Guarantees that the serialization system will never generate a serialized instance of the enclosing class.
- Parameters:
stream
- An object serialization stream.- Throws:
InvalidObjectException
- This method will throw with the message "Proxy required".
-