Documentation ¶
Overview ¶
A sequence of elements supporting sequential and parallel aggregate operations. The following example illustrates an aggregate operation using SEE java/util/function/Consumer.java
Index ¶
- type Characteristic
- type EmptySpliterator
- func (split *EmptySpliterator) Characteristics() Characteristic
- func (split *EmptySpliterator) EstimateSize() int
- func (split *EmptySpliterator) ForEachRemaining(ctx context.Context, consumer consumer.Consumer)
- func (split *EmptySpliterator) TryAdvance(ctx context.Context, consumer consumer.Consumer) bool
- func (split *EmptySpliterator) TrySplit() Spliterator
- type OfPrimitive
- type Spliterator
- func NewDelegatingSpliterator(supplier supplier.Supplier) Spliterator
- func NewDistinctSpliterator(s Spliterator) Spliterator
- func NewDistinctSpliterator2(s Spliterator, seen *seenMap) Spliterator
- func NewInfiniteSupplyingSpliterator(size int, s supplier.Supplier) Spliterator
- func NewSliceSpliterator2(acs Characteristic, arrays ...interface{}) Spliterator
- func NewSliceSpliterator4(origin int, fence int, acs Characteristic, arrays ...interface{}) Spliterator
- type TODO
- func (split *TODO) Characteristics() Characteristic
- func (split *TODO) EstimateSize() int
- func (split *TODO) ForEachRemaining(ctx context.Context, action consumer.Consumer)
- func (split *TODO) GetComparator() object.Comparator
- func (split *TODO) GetExactSizeIfKnown() int
- func (split *TODO) HasCharacteristics(characteristics Characteristic) bool
- func (split *TODO) TryAdvance(action consumer.Consumer) bool
- func (split *TODO) TrySplit() Spliterator
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Characteristic ¶
type Characteristic int
const ( CharacteristicTODO Characteristic = 0x00000000 /** * Characteristic value signifying that an encounter order is defined for * elements. If so, this Spliterator guarantees that method * {@link #trySplit} splits a strict prefix of elements, that method * {@link #tryAdvance} steps by one element in prefix order, and that * {@link #forEachRemaining} performs actions in encounter order. * * <p>A {@link Collection} has an encounter order if the corresponding * {@link Collection#iterator} documents an order. If so, the encounter * order is the same as the documented order. Otherwise, a collection does * not have an encounter order. * * @apiNote Encounter order is guaranteed to be ascending index order for * any {@link List}. But no order is guaranteed for hash-based collections * such as {@link HashSet}. Clients of a Spliterator that reports * {@code ORDERED} are expected to preserve ordering constraints in * non-commutative parallel computations. */ CharacteristicOrdered Characteristic = 0x00000010 /** * Characteristic value signifying that, for each pair of * encountered elements {@code x, y}, {@code !x.equals(y)}. This * applies for example, to a Spliterator based on a {@link Set}. */ CharacteristicDistinct Characteristic = 0x00000001 /** * Characteristic value signifying that encounter order follows a defined * sort order. If so, method {@link #getComparator()} returns the associated * Comparator, or {@code null} if all elements are {@link Comparable} and * are sorted by their natural ordering. * * <p>A Spliterator that reports {@code SORTED} must also report * {@code ORDERED}. * * @apiNote The spliterators for {@code Collection} classes in the JDK that * implement {@link NavigableSet} or {@link SortedSet} report {@code SORTED}. */ CharacteristicSorted Characteristic = 0x00000004 /** * Characteristic value signifying that the value returned from * {@code estimateSize()} prior to traversal or splitting represents a * finite size that, in the absence of structural source modification, * represents an exact count of the number of elements that would be * encountered by a complete traversal. * * @apiNote Most Spliterators for Collections, that cover all elements of a * {@code Collection} report this characteristic. Sub-spliterators, such as * those for {@link HashSet}, that cover a sub-set of elements and * approximate their reported size do not. */ CharacteristicSized Characteristic = 0x00000040 /** * Characteristic value signifying that the source guarantees that * encountered elements will not be {@code null}. (This applies, * for example, to most concurrent collections, queues, and maps.) */ CharacteristicNonnulL Characteristic = 0x00000100 /** * Characteristic value signifying that the element source cannot be * structurally modified; that is, elements cannot be added, replaced, or * removed, so such changes cannot occur during traversal. A Spliterator * that does not report {@code IMMUTABLE} or {@code CONCURRENT} is expected * to have a documented policy (for example throwing * {@link ConcurrentModificationException}) concerning structural * interference detected during traversal. */ CharacteristicImmutable Characteristic = 0x00000400 /** * Characteristic value signifying that the element source may be safely * concurrently modified (allowing additions, replacements, and/or removals) * by multiple threads without external synchronization. If so, the * Spliterator is expected to have a documented policy concerning the impact * of modifications during traversal. * * <p>A top-level Spliterator should not report both {@code CONCURRENT} and * {@code SpliteratorSIZED}, since the finite size, if known, may change if the source * is concurrently modified during traversal. Such a Spliterator is * inconsistent and no guarantees can be made about any computation using * that Spliterator. Sub-spliterators may report {@code SpliteratorSIZED} if the * sub-split size is known and additions or removals to the source are not * reflected when traversing. * * <p>A top-level Spliterator should not report both {@code CONCURRENT} and * {@code IMMUTABLE}, since they are mutually exclusive. Such a Spliterator * is inconsistent and no guarantees can be made about any computation using * that Spliterator. Sub-spliterators may report {@code IMMUTABLE} if * additions or removals to the source are not reflected when traversing. * * @apiNote Most concurrent collections maintain a consistency policy * guaranteeing accuracy with respect to elements present at the point of * Spliterator construction, but possibly not reflecting subsequent * additions or removals. */ CharacteristicConcurrent Characteristic = 0x00001000 /** * Characteristic value signifying that all Spliterators resulting from * {@code trySplit()} will be both {@link #SpliteratorSIZED} and {@link #SUBSIZED}. * (This means that all child Spliterators, whether direct or indirect, will * be {@code SpliteratorSIZED}.) * * <p>A Spliterator that does not report {@code SpliteratorSIZED} as required by * {@code SUBSIZED} is inconsistent and no guarantees can be made about any * computation using that Spliterator. * * @apiNote Some spliterators, such as the top-level spliterator for an * approximately balanced binary tree, will report {@code SpliteratorSIZED} but not * {@code SUBSIZED}, since it is common to know the size of the entire tree * but not the exact sizes of subtrees. */ CharacteristicSubsized Characteristic = 0x00004000 )
type EmptySpliterator ¶
type EmptySpliterator struct {
TODO
}
func NewEmptySpliterator ¶
func NewEmptySpliterator() *EmptySpliterator
func (*EmptySpliterator) Characteristics ¶
func (split *EmptySpliterator) Characteristics() Characteristic
func (*EmptySpliterator) EstimateSize ¶
func (split *EmptySpliterator) EstimateSize() int
func (*EmptySpliterator) ForEachRemaining ¶
func (split *EmptySpliterator) ForEachRemaining(ctx context.Context, consumer consumer.Consumer)
func (*EmptySpliterator) TryAdvance ¶
func (*EmptySpliterator) TrySplit ¶
func (split *EmptySpliterator) TrySplit() Spliterator
type OfPrimitive ¶
type OfPrimitive struct {
TODO
}
func NewOfPrimitive ¶
func NewOfPrimitive() *OfPrimitive
func (*OfPrimitive) ForEachRemaining ¶
func (split *OfPrimitive) ForEachRemaining(ctx context.Context, action consumer.Consumer)
*
- Performs the given action for each remaining element, sequentially in
- the current thread, until all elements have been processed or the
- action throws an exception. If this Spliterator is {@link #ORDERED},
- actions are performed in encounter order. Exceptions thrown by the
- action are relayed to the caller. *
- @implSpec
- The default implementation repeatedly invokes {@link #tryAdvance}
- until it returns {@code false}. It should be overridden whenever
- possible. *
- @param action The action
- @throws NullPointerException if the specified action is null
func (*OfPrimitive) TryAdvance ¶
*
- If a remaining element exists, performs the given action on it,
- returning {@code true}; else returns {@code false}. If this
- Spliterator is {@link #ORDERED} the action is performed on the
- next element in encounter order. Exceptions thrown by the
- action are relayed to the caller. *
- @param action The action
- @return {@code false} if no remaining elements existed
- upon entry to this method, else {@code true}.
- @throws NullPointerException if the specified action is null
func (*OfPrimitive) TrySplit ¶
func (split *OfPrimitive) TrySplit() Spliterator
type Spliterator ¶
type Spliterator interface { /** * If a remaining element exists, performs the given action on it, * returning {@code true}; else returns {@code false}. If this * Spliterator is {@link #ORDERED} the action is performed on the * next element in encounter order. Exceptions thrown by the * action are relayed to the caller. * * @param action The action * @return {@code false} if no remaining elements existed * upon entry to this method, else {@code true}. * @throws NullPointerException if the specified action is null */ TryAdvance(ctx context.Context, consumer consumer.Consumer) bool /** * Performs the given action for each remaining element, sequentially in * the current thread, until all elements have been processed or the action * throws an exception. If this Spliterator is {@link #ORDERED}, actions * are performed in encounter order. Exceptions thrown by the action * are relayed to the caller. * * @implSpec * The default implementation repeatedly invokes {@link #tryAdvance} until * it returns {@code false}. It should be overridden whenever possible. * * @param action The action * @throws NullPointerException if the specified action is null */ ForEachRemaining(ctx context.Context, consumer consumer.Consumer) /** * If this spliterator can be partitioned, returns a Spliterator * covering elements, that will, upon return from this method, not * be covered by this Spliterator. * * <p>If this Spliterator is {@link #ORDERED}, the returned Spliterator * must cover a strict prefix of the elements. * * <p>Unless this Spliterator covers an infinite number of elements, * repeated calls to {@code trySplit()} must eventually return {@code null}. * Upon non-null return: * <ul> * <li>the value reported for {@code estimateSize()} before splitting, * must, after splitting, be greater than or equal to {@code estimateSize()} * for this and the returned Spliterator; and</li> * <li>if this Spliterator is {@code SUBSIZED}, then {@code estimateSize()} * for this spliterator before splitting must be equal to the sum of * {@code estimateSize()} for this and the returned Spliterator after * splitting.</li> * </ul> * * <p>This method may return {@code null} for any reason, * including emptiness, inability to split after traversal has * commenced, data structure constraints, and efficiency * considerations. * * @apiNote * An ideal {@code trySplit} method efficiently (without * traversal) divides its elements exactly in half, allowing * balanced parallel computation. Many departures from this ideal * remain highly effective; for example, only approximately * splitting an approximately balanced tree, or for a tree in * which leaf nodes may contain either one or two elements, * failing to further split these nodes. However, large * deviations in balance and/or overly inefficient {@code * trySplit} mechanics typically result in poor parallel * performance. * * @return a {@code Spliterator} covering some portion of the * elements, or {@code null} if this spliterator cannot be split */ TrySplit() Spliterator EstimateSize() int /** * Convenience method that returns {@link #estimateSize()} if this * Spliterator is {@link #SpliteratorSIZED}, else {@code -1}. * @implSpec * The default implementation returns the result of {@code estimateSize()} * if the Spliterator reports a characteristic of {@code SpliteratorSIZED}, and * {@code -1} otherwise. * * @return the exact size, if known, else {@code -1}. */ GetExactSizeIfKnown() int Characteristics() Characteristic /** * Returns {@code true} if this Spliterator's {@link * #characteristics} contain all of the given characteristics. * * @implSpec * The default implementation returns true if the corresponding bits * of the given characteristics are set. * * @param characteristics the characteristics to check for * @return {@code true} if all the specified characteristics are present, * else {@code false} */ HasCharacteristics(characteristics Characteristic) bool /** * If this Spliterator's source is {@link #SORTED} by a {@link Comparator}, * returns that {@code Comparator}. If the source is {@code SORTED} in * {@linkplain Comparable natural order}, returns {@code null}. Otherwise, * if the source is not {@code SORTED}, throws {@link IllegalStateException}. * * @implSpec * The default implementation always throws {@link IllegalStateException}. * * @return a Comparator, or {@code null} if the elements are sorted in the * natural order. * @throws IllegalStateException if the spliterator does not report * a characteristic of {@code SORTED}. */ GetComparator() object.Comparator }
*
- An object for traversing and partitioning elements of a source. The source
- of elements covered by a Spliterator could be, for example, an array, a
- {@link Collection}, an IO channel, or a generator function. *
- <p>A Spliterator may traverse elements individually ({@link
- #tryAdvance tryAdvance()}) or sequentially in bulk
- ({@link #forEachRemaining forEachRemaining()}). *
- <p>A Spliterator may also partition off some of its elements (using
- {@link #trySplit}) as another Spliterator, to be used in
- possibly-parallel operations. Operations using a Spliterator that
- cannot split, or does so in a highly imbalanced or inefficient
- manner, are unlikely to benefit from parallelism. Traversal
- and splitting exhaust elements; each Spliterator is useful for only a single
- bulk computation. *
- <p>A Spliterator also reports a set of {@link #characteristics()} of its
- structure, source, and elements from among {@link #ORDERED},
- {@link #SpliteratorDISTINCT}, {@link #SORTED}, {@link #SpliteratorSIZED}, {@link #NONNULL},
- {@link #IMMUTABLE}, {@link #CONCURRENT}, and {@link #SUBSIZED}. These may
- be employed by Spliterator clients to control, specialize or simplify
- computation. For example, a Spliterator for a {@link Collection} would
- report {@code SpliteratorSIZED}, a Spliterator for a {@link Set} would report
- {@code SpliteratorDISTINCT}, and a Spliterator for a {@link SortedSet} would also
- report {@code SORTED}. Characteristics are reported as a simple unioned bit
- set. *
- Some characteristics additionally constrain method behavior; for example if
- {@code ORDERED}, traversal methods must conform to their documented ordering.
- New characteristics may be defined in the future, so implementors should not
- assign meanings to unlisted values. *
- <p><a id="binding">A Spliterator that does not report {@code IMMUTABLE} or
- {@code CONCURRENT} is expected to have a documented policy concerning:
- when the spliterator <em>binds</em> to the element source; and detection of
- structural interference of the element source detected after binding.</a> A
- <em>late-binding</em> Spliterator binds to the source of elements at the
- point of first traversal, first split, or first query for estimated size,
- rather than at the time the Spliterator is created. A Spliterator that is
- not <em>late-binding</em> binds to the source of elements at the point of
- construction or first invocation of any method. Modifications made to the
- source prior to binding are reflected when the Spliterator is traversed.
- After binding a Spliterator should, on a best-effort basis, throw
- {@link ConcurrentModificationException} if structural interference is
- detected. Spliterators that do this are called <em>fail-fast</em>. The
- bulk traversal method ({@link #forEachRemaining forEachRemaining()}) of a
- Spliterator may optimize traversal and check for structural interference
- after all elements have been traversed, rather than checking per-element and
- failing immediately. *
- <p>Spliterators can provide an estimate of the number of remaining elements
- via the {@link #estimateSize} method. Ideally, as reflected in characteristic
- {@link #SpliteratorSIZED}, this value corresponds exactly to the number of elements
- that would be encountered in a successful traversal. However, even when not
- exactly known, an estimated value may still be useful to operations
- being performed on the source, such as helping to determine whether it is
- preferable to split further or traverse the remaining elements sequentially. *
- <p>Despite their obvious utility in parallel algorithms, spliterators are not
- expected to be thread-safe; instead, implementations of parallel algorithms
- using spliterators should ensure that the spliterator is only used by one
- thread at a time. This is generally easy to attain via <em>serial
- thread-confinement</em>, which often is a natural consequence of typical
- parallel algorithms that work by recursive decomposition. A thread calling
- {@link #trySplit()} may hand over the returned Spliterator to another thread,
- which in turn may traverse or further split that Spliterator. The behaviour
- of splitting and traversal is undefined if two or more threads operate
- concurrently on the same spliterator. If the original thread hands a
- spliterator off to another thread for processing, it is best if that handoff
- occurs before any elements are consumed with {@link #tryAdvance(Consumer)
- tryAdvance()}, as certain guarantees (such as the accuracy of
- {@link #estimateSize()} for {@code SpliteratorSIZED} spliterators) are only valid before
- traversal has begun. *
- <p>Primitive subtype specializations of {@code Spliterator} are provided for
- {@link OfInt int}, {@link OfLong long}, and {@link OfDouble double} values.
- The subtype default implementations of
- {@link Spliterator#tryAdvance(java.util.function.Consumer)}
- and {@link Spliterator#forEachRemaining(java.util.function.Consumer)} box
- primitive values to instances of their corresponding wrapper class. Such
- boxing may undermine any performance advantages gained by using the primitive
- specializations. To avoid boxing, the corresponding primitive-based methods
- should be used. For example,
- {@link Spliterator.OfInt#tryAdvance(java.util.function.IntConsumer)}
- and {@link Spliterator.OfInt#forEachRemaining(java.util.function.IntConsumer)}
- should be used in preference to
- {@link Spliterator.OfInt#tryAdvance(java.util.function.Consumer)} and
- {@link Spliterator.OfInt#forEachRemaining(java.util.function.Consumer)}.
- Traversal of primitive values using boxing-based methods
- {@link #tryAdvance tryAdvance()} and
- {@link #forEachRemaining(java.util.function.Consumer) forEachRemaining()}
- does not affect the order in which the values, transformed to boxed values,
- are encountered. *
- @apiNote
- <p>Spliterators, like {@code Iterator}s, are for traversing the elements of
- a source. The {@code Spliterator} API was designed to support efficient
- parallel traversal in addition to sequential traversal, by supporting
- decomposition as well as single-element iteration. In addition, the
- protocol for accessing elements via a Spliterator is designed to impose
- smaller per-element overhead than {@code Iterator}, and to avoid the inherent
- race involved in having separate methods for {@code hasNext()} and
- {@code next()}. *
- <p>For mutable sources, arbitrary and non-deterministic behavior may occur if
- the source is structurally interfered with (elements added, replaced, or
- removed) between the time that the Spliterator binds to its data source and
- the end of traversal. For example, such interference will produce arbitrary,
- non-deterministic results when using the {@code java.util.stream} framework. *
- <p>Structural interference of a source can be managed in the following ways
- (in approximate order of decreasing desirability):
- <ul>
- <li>The source cannot be structurally interfered with.
- <br>For example, an instance of
- {@link java.util.concurrent.CopyOnWriteArrayList} is an immutable source.
- A Spliterator created from the source reports a characteristic of
- {@code IMMUTABLE}.</li>
- <li>The source manages concurrent modifications.
- <br>For example, a key set of a {@link java.util.concurrent.ConcurrentHashMap}
- is a concurrent source. A Spliterator created from the source reports a
- characteristic of {@code CONCURRENT}.</li>
- <li>The mutable source provides a late-binding and fail-fast Spliterator.
- <br>Late binding narrows the window during which interference can affect
- the calculation; fail-fast detects, on a best-effort basis, that structural
- interference has occurred after traversal has commenced and throws
- {@link ConcurrentModificationException}. For example, {@link ArrayList},
- and many other non-concurrent {@code Collection} classes in the JDK, provide
- a late-binding, fail-fast spliterator.</li>
- <li>The mutable source provides a non-late-binding but fail-fast Spliterator.
- <br>The source increases the likelihood of throwing
- {@code ConcurrentModificationException} since the window of potential
- interference is larger.</li>
- <li>The mutable source provides a late-binding and non-fail-fast Spliterator.
- <br>The source risks arbitrary, non-deterministic behavior after traversal
- has commenced since interference is not detected.
- </li>
- <li>The mutable source provides a non-late-binding and non-fail-fast
- Spliterator.
- <br>The source increases the risk of arbitrary, non-deterministic behavior
- since non-detected interference may occur after construction.
- </li>
- </ul> *
- <p><b>Example.</b> Here is a class (not a very useful one, except
- for illustration) that maintains an array in which the actual data
- are held in even locations, and unrelated tag data are held in odd
- locations. Its Spliterator ignores the tags. *
- <pre> {@code
- class TaggedArray<T> {
- private final Object[] elements; // immutable after construction
- TaggedArray(T[] data, Object[] tags) {
- int size = data.length;
- if (tags.length != size) throw new IllegalArgumentException();
- this.elements = new Object[2 * size];
- for (int i = 0, j = 0; i < size; ++i) {
- elements[j++] = data[i];
- elements[j++] = tags[i];
- }
- } *
- public Spliterator<T> spliterator() {
- return new TaggedArraySpliterator<>(elements, 0, elements.length);
- } *
- static class TaggedArraySpliterator<T> implements Spliterator<T> {
- private final Object[] array;
- private int origin; // current index, advanced on split or traversal
- private final int fence; // one past the greatest index *
- TaggedArraySpliterator(Object[] array, int origin, int fence) {
- this.array = array; this.origin = origin; this.fence = fence;
- } *
- public void forEachRemaining(Consumer<? super T> action) {
- for (; origin < fence; origin += 2)
- action.accept((T) array[origin]);
- } *
- public boolean tryAdvance(Consumer<? super T> action) {
- if (origin < fence) {
- action.accept((T) array[origin]);
- origin += 2;
- return true;
- }
- else // cannot advance
- return false;
- } *
- public Spliterator<T> trySplit() {
- int lo = origin; // divide range in half
- int mid = ((lo + fence) >>> 1) & ~1; // force midpoint to be even
- if (lo < mid) { // split out left half
- origin = mid; // reset this Spliterator's origin
- return new TaggedArraySpliterator<>(array, lo, mid);
- }
- else // too small to split
- return null;
- } *
- public long estimateSize() {
- return (long)((fence - origin) / 2);
- } *
- public int characteristics() {
- return ORDERED | SpliteratorSIZED | IMMUTABLE | SUBSIZED;
- }
- }
- }}</pre> *
- <p>As an example how a parallel computation framework, such as the
- {@code java.util.stream} package, would use Spliterator in a parallel
- computation, here is one way to implement an associated parallel forEach,
- that illustrates the primary usage idiom of splitting off subtasks until
- the estimated amount of work is small enough to perform
- sequentially. Here we assume that the order of processing across
- subtasks doesn't matter; different (forked) tasks may further split
- and process elements concurrently in undetermined order. This
- example uses a {@link java.util.concurrent.CountedCompleter};
- similar usages apply to other parallel task constructions. *
- <pre>{@code
- static <T> void parEach(TaggedArray<T> a, Consumer<T> action) {
- Spliterator<T> s = a.spliterator();
- long targetBatchSize = s.estimateSize() / (ForkJoinPool.getCommonPoolParallelism() * 8);
- new ParEach(null, s, action, targetBatchSize).invoke();
- } *
- static class ParEach<T> extends CountedCompleter<Void> {
- final Spliterator<T> spliterator;
- final Consumer<T> action;
- final long targetBatchSize; *
- ParEach(ParEach<T> parent, Spliterator<T> spliterator,
- Consumer<T> action, long targetBatchSize) {
- super(parent);
- this.spliterator = spliterator; this.action = action;
- this.targetBatchSize = targetBatchSize;
- } *
- public void compute() {
- Spliterator<T> sub;
- while (spliterator.estimateSize() > targetBatchSize &&
- (sub = spliterator.trySplit()) != null) {
- addToPendingCount(1);
- new ParEach<>(this, sub, action, targetBatchSize).fork();
- }
- spliterator.forEachRemaining(action);
- propagateCompletion();
- }
- }}</pre> *
- @implNote
- If the boolean system property {@code org.openjdk.java.util.stream.tripwire}
- is set to {@code true} then diagnostic warnings are reported if boxing of
- primitive values occur when operating on primitive subtype specializations. *
- @param <T> the type of elements returned by this Spliterator *
- @see Collection
- @since 1.8
func NewDelegatingSpliterator ¶
func NewDelegatingSpliterator(supplier supplier.Supplier) Spliterator
func NewDistinctSpliterator ¶
func NewDistinctSpliterator(s Spliterator) Spliterator
func NewDistinctSpliterator2 ¶
func NewDistinctSpliterator2(s Spliterator, seen *seenMap) Spliterator
func NewInfiniteSupplyingSpliterator ¶
func NewInfiniteSupplyingSpliterator(size int, s supplier.Supplier) Spliterator
func NewSliceSpliterator2 ¶
func NewSliceSpliterator2(acs Characteristic, arrays ...interface{}) Spliterator
func NewSliceSpliterator4 ¶
func NewSliceSpliterator4(origin int, fence int, acs Characteristic, arrays ...interface{}) Spliterator
type TODO ¶
func (*TODO) Characteristics ¶
func (split *TODO) Characteristics() Characteristic
func (*TODO) EstimateSize ¶
func (*TODO) ForEachRemaining ¶
func (*TODO) GetComparator ¶
func (split *TODO) GetComparator() object.Comparator
func (*TODO) GetExactSizeIfKnown ¶
func (*TODO) HasCharacteristics ¶
func (split *TODO) HasCharacteristics(characteristics Characteristic) bool
func (*TODO) TrySplit ¶
func (split *TODO) TrySplit() Spliterator
Click to show internal directories.
Click to hide internal directories.