Home | History | Annotate | Download | only in util
      1 /*
      2  * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
      3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
      4  *
      5  * This code is free software; you can redistribute it and/or modify it
      6  * under the terms of the GNU General Public License version 2 only, as
      7  * published by the Free Software Foundation.  Oracle designates this
      8  * particular file as subject to the "Classpath" exception as provided
      9  * by Oracle in the LICENSE file that accompanied this code.
     10  *
     11  * This code is distributed in the hope that it will be useful, but WITHOUT
     12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
     13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     14  * version 2 for more details (a copy is included in the LICENSE file that
     15  * accompanied this code).
     16  *
     17  * You should have received a copy of the GNU General Public License version
     18  * 2 along with this work; if not, write to the Free Software Foundation,
     19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
     20  *
     21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
     22  * or visit www.oracle.com if you need additional information or have any
     23  * questions.
     24  */
     25 package java.util;
     26 
     27 import java.util.function.Consumer;
     28 import java.util.function.DoubleConsumer;
     29 import java.util.function.IntConsumer;
     30 import java.util.function.LongConsumer;
     31 
     32 /**
     33  * An object for traversing and partitioning elements of a source.  The source
     34  * of elements covered by a Spliterator could be, for example, an array, a
     35  * {@link Collection}, an IO channel, or a generator function.
     36  *
     37  * <p>A Spliterator may traverse elements individually ({@link
     38  * #tryAdvance tryAdvance()}) or sequentially in bulk
     39  * ({@link #forEachRemaining forEachRemaining()}).
     40  *
     41  * <p>A Spliterator may also partition off some of its elements (using
     42  * {@link #trySplit}) as another Spliterator, to be used in
     43  * possibly-parallel operations.  Operations using a Spliterator that
     44  * cannot split, or does so in a highly imbalanced or inefficient
     45  * manner, are unlikely to benefit from parallelism.  Traversal
     46  * and splitting exhaust elements; each Spliterator is useful for only a single
     47  * bulk computation.
     48  *
     49  * <p>A Spliterator also reports a set of {@link #characteristics()} of its
     50  * structure, source, and elements from among {@link #ORDERED},
     51  * {@link #DISTINCT}, {@link #SORTED}, {@link #SIZED}, {@link #NONNULL},
     52  * {@link #IMMUTABLE}, {@link #CONCURRENT}, and {@link #SUBSIZED}. These may
     53  * be employed by Spliterator clients to control, specialize or simplify
     54  * computation.  For example, a Spliterator for a {@link Collection} would
     55  * report {@code SIZED}, a Spliterator for a {@link Set} would report
     56  * {@code DISTINCT}, and a Spliterator for a {@link SortedSet} would also
     57  * report {@code SORTED}.  Characteristics are reported as a simple unioned bit
     58  * set.
     59  *
     60  * Some characteristics additionally constrain method behavior; for example if
     61  * {@code ORDERED}, traversal methods must conform to their documented ordering.
     62  * New characteristics may be defined in the future, so implementors should not
     63  * assign meanings to unlisted values.
     64  *
     65  * <p><a name="binding">A Spliterator that does not report {@code IMMUTABLE} or
     66  * {@code CONCURRENT} is expected to have a documented policy concerning:
     67  * when the spliterator <em>binds</em> to the element source; and detection of
     68  * structural interference of the element source detected after binding.</a>  A
     69  * <em>late-binding</em> Spliterator binds to the source of elements at the
     70  * point of first traversal, first split, or first query for estimated size,
     71  * rather than at the time the Spliterator is created.  A Spliterator that is
     72  * not <em>late-binding</em> binds to the source of elements at the point of
     73  * construction or first invocation of any method.  Modifications made to the
     74  * source prior to binding are reflected when the Spliterator is traversed.
     75  * After binding a Spliterator should, on a best-effort basis, throw
     76  * {@link ConcurrentModificationException} if structural interference is
     77  * detected.  Spliterators that do this are called <em>fail-fast</em>.  The
     78  * bulk traversal method ({@link #forEachRemaining forEachRemaining()}) of a
     79  * Spliterator may optimize traversal and check for structural interference
     80  * after all elements have been traversed, rather than checking per-element and
     81  * failing immediately.
     82  *
     83  * <p>Spliterators can provide an estimate of the number of remaining elements
     84  * via the {@link #estimateSize} method.  Ideally, as reflected in characteristic
     85  * {@link #SIZED}, this value corresponds exactly to the number of elements
     86  * that would be encountered in a successful traversal.  However, even when not
     87  * exactly known, an estimated value value may still be useful to operations
     88  * being performed on the source, such as helping to determine whether it is
     89  * preferable to split further or traverse the remaining elements sequentially.
     90  *
     91  * <p>Despite their obvious utility in parallel algorithms, spliterators are not
     92  * expected to be thread-safe; instead, implementations of parallel algorithms
     93  * using spliterators should ensure that the spliterator is only used by one
     94  * thread at a time.  This is generally easy to attain via <em>serial
     95  * thread-confinement</em>, which often is a natural consequence of typical
     96  * parallel algorithms that work by recursive decomposition.  A thread calling
     97  * {@link #trySplit()} may hand over the returned Spliterator to another thread,
     98  * which in turn may traverse or further split that Spliterator.  The behaviour
     99  * of splitting and traversal is undefined if two or more threads operate
    100  * concurrently on the same spliterator.  If the original thread hands a
    101  * spliterator off to another thread for processing, it is best if that handoff
    102  * occurs before any elements are consumed with {@link #tryAdvance(Consumer)
    103  * tryAdvance()}, as certain guarantees (such as the accuracy of
    104  * {@link #estimateSize()} for {@code SIZED} spliterators) are only valid before
    105  * traversal has begun.
    106  *
    107  * <p>Primitive subtype specializations of {@code Spliterator} are provided for
    108  * {@link OfInt int}, {@link OfLong long}, and {@link OfDouble double} values.
    109  * The subtype default implementations of
    110  * {@link Spliterator#tryAdvance(java.util.function.Consumer)}
    111  * and {@link Spliterator#forEachRemaining(java.util.function.Consumer)} box
    112  * primitive values to instances of their corresponding wrapper class.  Such
    113  * boxing may undermine any performance advantages gained by using the primitive
    114  * specializations.  To avoid boxing, the corresponding primitive-based methods
    115  * should be used.  For example,
    116  * {@link Spliterator.OfInt#tryAdvance(java.util.function.IntConsumer)}
    117  * and {@link Spliterator.OfInt#forEachRemaining(java.util.function.IntConsumer)}
    118  * should be used in preference to
    119  * {@link Spliterator.OfInt#tryAdvance(java.util.function.Consumer)} and
    120  * {@link Spliterator.OfInt#forEachRemaining(java.util.function.Consumer)}.
    121  * Traversal of primitive values using boxing-based methods
    122  * {@link #tryAdvance tryAdvance()} and
    123  * {@link #forEachRemaining(java.util.function.Consumer) forEachRemaining()}
    124  * does not affect the order in which the values, transformed to boxed values,
    125  * are encountered.
    126  *
    127  * @apiNote
    128  * <p>Spliterators, like {@code Iterator}s, are for traversing the elements of
    129  * a source.  The {@code Spliterator} API was designed to support efficient
    130  * parallel traversal in addition to sequential traversal, by supporting
    131  * decomposition as well as single-element iteration.  In addition, the
    132  * protocol for accessing elements via a Spliterator is designed to impose
    133  * smaller per-element overhead than {@code Iterator}, and to avoid the inherent
    134  * race involved in having separate methods for {@code hasNext()} and
    135  * {@code next()}.
    136  *
    137  * <p>For mutable sources, arbitrary and non-deterministic behavior may occur if
    138  * the source is structurally interfered with (elements added, replaced, or
    139  * removed) between the time that the Spliterator binds to its data source and
    140  * the end of traversal.  For example, such interference will produce arbitrary,
    141  * non-deterministic results when using the {@code java.util.stream} framework.
    142  *
    143  * <p>Structural interference of a source can be managed in the following ways
    144  * (in approximate order of decreasing desirability):
    145  * <ul>
    146  * <li>The source cannot be structurally interfered with.
    147  * <br>For example, an instance of
    148  * {@link java.util.concurrent.CopyOnWriteArrayList} is an immutable source.
    149  * A Spliterator created from the source reports a characteristic of
    150  * {@code IMMUTABLE}.</li>
    151  * <li>The source manages concurrent modifications.
    152  * <br>For example, a key set of a {@link java.util.concurrent.ConcurrentHashMap}
    153  * is a concurrent source.  A Spliterator created from the source reports a
    154  * characteristic of {@code CONCURRENT}.</li>
    155  * <li>The mutable source provides a late-binding and fail-fast Spliterator.
    156  * <br>Late binding narrows the window during which interference can affect
    157  * the calculation; fail-fast detects, on a best-effort basis, that structural
    158  * interference has occurred after traversal has commenced and throws
    159  * {@link ConcurrentModificationException}.  For example, {@link ArrayList},
    160  * and many other non-concurrent {@code Collection} classes in the JDK, provide
    161  * a late-binding, fail-fast spliterator.</li>
    162  * <li>The mutable source provides a non-late-binding but fail-fast Spliterator.
    163  * <br>The source increases the likelihood of throwing
    164  * {@code ConcurrentModificationException} since the window of potential
    165  * interference is larger.</li>
    166  * <li>The mutable source provides a late-binding and non-fail-fast Spliterator.
    167  * <br>The source risks arbitrary, non-deterministic behavior after traversal
    168  * has commenced since interference is not detected.
    169  * </li>
    170  * <li>The mutable source provides a non-late-binding and non-fail-fast
    171  * Spliterator.
    172  * <br>The source increases the risk of arbitrary, non-deterministic behavior
    173  * since non-detected interference may occur after construction.
    174  * </li>
    175  * </ul>
    176  *
    177  * <p><b>Example.</b> Here is a class (not a very useful one, except
    178  * for illustration) that maintains an array in which the actual data
    179  * are held in even locations, and unrelated tag data are held in odd
    180  * locations. Its Spliterator ignores the tags.
    181  *
    182  * <pre> {@code
    183  * class TaggedArray<T> {
    184  *   private final Object[] elements; // immutable after construction
    185  *   TaggedArray(T[] data, Object[] tags) {
    186  *     int size = data.length;
    187  *     if (tags.length != size) throw new IllegalArgumentException();
    188  *     this.elements = new Object[2 * size];
    189  *     for (int i = 0, j = 0; i < size; ++i) {
    190  *       elements[j++] = data[i];
    191  *       elements[j++] = tags[i];
    192  *     }
    193  *   }
    194  *
    195  *   public Spliterator<T> spliterator() {
    196  *     return new TaggedArraySpliterator<>(elements, 0, elements.length);
    197  *   }
    198  *
    199  *   static class TaggedArraySpliterator<T> implements Spliterator<T> {
    200  *     private final Object[] array;
    201  *     private int origin; // current index, advanced on split or traversal
    202  *     private final int fence; // one past the greatest index
    203  *
    204  *     TaggedArraySpliterator(Object[] array, int origin, int fence) {
    205  *       this.array = array; this.origin = origin; this.fence = fence;
    206  *     }
    207  *
    208  *     public void forEachRemaining(Consumer<? super T> action) {
    209  *       for (; origin < fence; origin += 2)
    210  *         action.accept((T) array[origin]);
    211  *     }
    212  *
    213  *     public boolean tryAdvance(Consumer<? super T> action) {
    214  *       if (origin < fence) {
    215  *         action.accept((T) array[origin]);
    216  *         origin += 2;
    217  *         return true;
    218  *       }
    219  *       else // cannot advance
    220  *         return false;
    221  *     }
    222  *
    223  *     public Spliterator<T> trySplit() {
    224  *       int lo = origin; // divide range in half
    225  *       int mid = ((lo + fence) >>> 1) & ~1; // force midpoint to be even
    226  *       if (lo < mid) { // split out left half
    227  *         origin = mid; // reset this Spliterator's origin
    228  *         return new TaggedArraySpliterator<>(array, lo, mid);
    229  *       }
    230  *       else       // too small to split
    231  *         return null;
    232  *     }
    233  *
    234  *     public long estimateSize() {
    235  *       return (long)((fence - origin) / 2);
    236  *     }
    237  *
    238  *     public int characteristics() {
    239  *       return ORDERED | SIZED | IMMUTABLE | SUBSIZED;
    240  *     }
    241  *   }
    242  * }}</pre>
    243  *
    244  * <p>As an example how a parallel computation framework, such as the
    245  * {@code java.util.stream} package, would use Spliterator in a parallel
    246  * computation, here is one way to implement an associated parallel forEach,
    247  * that illustrates the primary usage idiom of splitting off subtasks until
    248  * the estimated amount of work is small enough to perform
    249  * sequentially. Here we assume that the order of processing across
    250  * subtasks doesn't matter; different (forked) tasks may further split
    251  * and process elements concurrently in undetermined order.  This
    252  * example uses a {@link java.util.concurrent.CountedCompleter};
    253  * similar usages apply to other parallel task constructions.
    254  *
    255  * <pre>{@code
    256  * static <T> void parEach(TaggedArray<T> a, Consumer<T> action) {
    257  *   Spliterator<T> s = a.spliterator();
    258  *   long targetBatchSize = s.estimateSize() / (ForkJoinPool.getCommonPoolParallelism() * 8);
    259  *   new ParEach(null, s, action, targetBatchSize).invoke();
    260  * }
    261  *
    262  * static class ParEach<T> extends CountedCompleter<Void> {
    263  *   final Spliterator<T> spliterator;
    264  *   final Consumer<T> action;
    265  *   final long targetBatchSize;
    266  *
    267  *   ParEach(ParEach<T> parent, Spliterator<T> spliterator,
    268  *           Consumer<T> action, long targetBatchSize) {
    269  *     super(parent);
    270  *     this.spliterator = spliterator; this.action = action;
    271  *     this.targetBatchSize = targetBatchSize;
    272  *   }
    273  *
    274  *   public void compute() {
    275  *     Spliterator<T> sub;
    276  *     while (spliterator.estimateSize() > targetBatchSize &&
    277  *            (sub = spliterator.trySplit()) != null) {
    278  *       addToPendingCount(1);
    279  *       new ParEach<>(this, sub, action, targetBatchSize).fork();
    280  *     }
    281  *     spliterator.forEachRemaining(action);
    282  *     propagateCompletion();
    283  *   }
    284  * }}</pre>
    285  *
    286  * @implNote
    287  * If the boolean system property {@code org.openjdk.java.util.stream.tripwire}
    288  * is set to {@code true} then diagnostic warnings are reported if boxing of
    289  * primitive values occur when operating on primitive subtype specializations.
    290  *
    291  * @param <T> the type of elements returned by this Spliterator
    292  *
    293  * @see Collection
    294  * @since 1.8
    295  */
    296 public interface Spliterator<T> {
    297     /**
    298      * If a remaining element exists, performs the given action on it,
    299      * returning {@code true}; else returns {@code false}.  If this
    300      * Spliterator is {@link #ORDERED} the action is performed on the
    301      * next element in encounter order.  Exceptions thrown by the
    302      * action are relayed to the caller.
    303      *
    304      * @param action The action
    305      * @return {@code false} if no remaining elements existed
    306      * upon entry to this method, else {@code true}.
    307      * @throws NullPointerException if the specified action is null
    308      */
    309     boolean tryAdvance(Consumer<? super T> action);
    310 
    311     /**
    312      * Performs the given action for each remaining element, sequentially in
    313      * the current thread, until all elements have been processed or the action
    314      * throws an exception.  If this Spliterator is {@link #ORDERED}, actions
    315      * are performed in encounter order.  Exceptions thrown by the action
    316      * are relayed to the caller.
    317      *
    318      * @implSpec
    319      * The default implementation repeatedly invokes {@link #tryAdvance} until
    320      * it returns {@code false}.  It should be overridden whenever possible.
    321      *
    322      * @param action The action
    323      * @throws NullPointerException if the specified action is null
    324      */
    325     default void forEachRemaining(Consumer<? super T> action) {
    326         do { } while (tryAdvance(action));
    327     }
    328 
    329     /**
    330      * If this spliterator can be partitioned, returns a Spliterator
    331      * covering elements, that will, upon return from this method, not
    332      * be covered by this Spliterator.
    333      *
    334      * <p>If this Spliterator is {@link #ORDERED}, the returned Spliterator
    335      * must cover a strict prefix of the elements.
    336      *
    337      * <p>Unless this Spliterator covers an infinite number of elements,
    338      * repeated calls to {@code trySplit()} must eventually return {@code null}.
    339      * Upon non-null return:
    340      * <ul>
    341      * <li>the value reported for {@code estimateSize()} before splitting,
    342      * must, after splitting, be greater than or equal to {@code estimateSize()}
    343      * for this and the returned Spliterator; and</li>
    344      * <li>if this Spliterator is {@code SUBSIZED}, then {@code estimateSize()}
    345      * for this spliterator before splitting must be equal to the sum of
    346      * {@code estimateSize()} for this and the returned Spliterator after
    347      * splitting.</li>
    348      * </ul>
    349      *
    350      * <p>This method may return {@code null} for any reason,
    351      * including emptiness, inability to split after traversal has
    352      * commenced, data structure constraints, and efficiency
    353      * considerations.
    354      *
    355      * @apiNote
    356      * An ideal {@code trySplit} method efficiently (without
    357      * traversal) divides its elements exactly in half, allowing
    358      * balanced parallel computation.  Many departures from this ideal
    359      * remain highly effective; for example, only approximately
    360      * splitting an approximately balanced tree, or for a tree in
    361      * which leaf nodes may contain either one or two elements,
    362      * failing to further split these nodes.  However, large
    363      * deviations in balance and/or overly inefficient {@code
    364      * trySplit} mechanics typically result in poor parallel
    365      * performance.
    366      *
    367      * @return a {@code Spliterator} covering some portion of the
    368      * elements, or {@code null} if this spliterator cannot be split
    369      */
    370     Spliterator<T> trySplit();
    371 
    372     /**
    373      * Returns an estimate of the number of elements that would be
    374      * encountered by a {@link #forEachRemaining} traversal, or returns {@link
    375      * Long#MAX_VALUE} if infinite, unknown, or too expensive to compute.
    376      *
    377      * <p>If this Spliterator is {@link #SIZED} and has not yet been partially
    378      * traversed or split, or this Spliterator is {@link #SUBSIZED} and has
    379      * not yet been partially traversed, this estimate must be an accurate
    380      * count of elements that would be encountered by a complete traversal.
    381      * Otherwise, this estimate may be arbitrarily inaccurate, but must decrease
    382      * as specified across invocations of {@link #trySplit}.
    383      *
    384      * @apiNote
    385      * Even an inexact estimate is often useful and inexpensive to compute.
    386      * For example, a sub-spliterator of an approximately balanced binary tree
    387      * may return a value that estimates the number of elements to be half of
    388      * that of its parent; if the root Spliterator does not maintain an
    389      * accurate count, it could estimate size to be the power of two
    390      * corresponding to its maximum depth.
    391      *
    392      * @return the estimated size, or {@code Long.MAX_VALUE} if infinite,
    393      *         unknown, or too expensive to compute.
    394      */
    395     long estimateSize();
    396 
    397     /**
    398      * Convenience method that returns {@link #estimateSize()} if this
    399      * Spliterator is {@link #SIZED}, else {@code -1}.
    400      * @implSpec
    401      * The default implementation returns the result of {@code estimateSize()}
    402      * if the Spliterator reports a characteristic of {@code SIZED}, and
    403      * {@code -1} otherwise.
    404      *
    405      * @return the exact size, if known, else {@code -1}.
    406      */
    407     default long getExactSizeIfKnown() {
    408         return (characteristics() & SIZED) == 0 ? -1L : estimateSize();
    409     }
    410 
    411     /**
    412      * Returns a set of characteristics of this Spliterator and its
    413      * elements. The result is represented as ORed values from {@link
    414      * #ORDERED}, {@link #DISTINCT}, {@link #SORTED}, {@link #SIZED},
    415      * {@link #NONNULL}, {@link #IMMUTABLE}, {@link #CONCURRENT},
    416      * {@link #SUBSIZED}.  Repeated calls to {@code characteristics()} on
    417      * a given spliterator, prior to or in-between calls to {@code trySplit},
    418      * should always return the same result.
    419      *
    420      * <p>If a Spliterator reports an inconsistent set of
    421      * characteristics (either those returned from a single invocation
    422      * or across multiple invocations), no guarantees can be made
    423      * about any computation using this Spliterator.
    424      *
    425      * @apiNote The characteristics of a given spliterator before splitting
    426      * may differ from the characteristics after splitting.  For specific
    427      * examples see the characteristic values {@link #SIZED}, {@link #SUBSIZED}
    428      * and {@link #CONCURRENT}.
    429      *
    430      * @return a representation of characteristics
    431      */
    432     int characteristics();
    433 
    434     /**
    435      * Returns {@code true} if this Spliterator's {@link
    436      * #characteristics} contain all of the given characteristics.
    437      *
    438      * @implSpec
    439      * The default implementation returns true if the corresponding bits
    440      * of the given characteristics are set.
    441      *
    442      * @param characteristics the characteristics to check for
    443      * @return {@code true} if all the specified characteristics are present,
    444      * else {@code false}
    445      */
    446     default boolean hasCharacteristics(int characteristics) {
    447         return (characteristics() & characteristics) == characteristics;
    448     }
    449 
    450     /**
    451      * If this Spliterator's source is {@link #SORTED} by a {@link Comparator},
    452      * returns that {@code Comparator}. If the source is {@code SORTED} in
    453      * {@linkplain Comparable natural order}, returns {@code null}.  Otherwise,
    454      * if the source is not {@code SORTED}, throws {@link IllegalStateException}.
    455      *
    456      * @implSpec
    457      * The default implementation always throws {@link IllegalStateException}.
    458      *
    459      * @return a Comparator, or {@code null} if the elements are sorted in the
    460      * natural order.
    461      * @throws IllegalStateException if the spliterator does not report
    462      *         a characteristic of {@code SORTED}.
    463      */
    464     default Comparator<? super T> getComparator() {
    465         throw new IllegalStateException();
    466     }
    467 
    468     /**
    469      * Characteristic value signifying that an encounter order is defined for
    470      * elements. If so, this Spliterator guarantees that method
    471      * {@link #trySplit} splits a strict prefix of elements, that method
    472      * {@link #tryAdvance} steps by one element in prefix order, and that
    473      * {@link #forEachRemaining} performs actions in encounter order.
    474      *
    475      * <p>A {@link Collection} has an encounter order if the corresponding
    476      * {@link Collection#iterator} documents an order. If so, the encounter
    477      * order is the same as the documented order. Otherwise, a collection does
    478      * not have an encounter order.
    479      *
    480      * @apiNote Encounter order is guaranteed to be ascending index order for
    481      * any {@link List}. But no order is guaranteed for hash-based collections
    482      * such as {@link HashSet}. Clients of a Spliterator that reports
    483      * {@code ORDERED} are expected to preserve ordering constraints in
    484      * non-commutative parallel computations.
    485      */
    486     public static final int ORDERED    = 0x00000010;
    487 
    488     /**
    489      * Characteristic value signifying that, for each pair of
    490      * encountered elements {@code x, y}, {@code !x.equals(y)}. This
    491      * applies for example, to a Spliterator based on a {@link Set}.
    492      */
    493     public static final int DISTINCT   = 0x00000001;
    494 
    495     /**
    496      * Characteristic value signifying that encounter order follows a defined
    497      * sort order. If so, method {@link #getComparator()} returns the associated
    498      * Comparator, or {@code null} if all elements are {@link Comparable} and
    499      * are sorted by their natural ordering.
    500      *
    501      * <p>A Spliterator that reports {@code SORTED} must also report
    502      * {@code ORDERED}.
    503      *
    504      * @apiNote The spliterators for {@code Collection} classes in the JDK that
    505      * implement {@link NavigableSet} or {@link SortedSet} report {@code SORTED}.
    506      */
    507     public static final int SORTED     = 0x00000004;
    508 
    509     /**
    510      * Characteristic value signifying that the value returned from
    511      * {@code estimateSize()} prior to traversal or splitting represents a
    512      * finite size that, in the absence of structural source modification,
    513      * represents an exact count of the number of elements that would be
    514      * encountered by a complete traversal.
    515      *
    516      * @apiNote Most Spliterators for Collections, that cover all elements of a
    517      * {@code Collection} report this characteristic. Sub-spliterators, such as
    518      * those for {@link HashSet}, that cover a sub-set of elements and
    519      * approximate their reported size do not.
    520      */
    521     public static final int SIZED      = 0x00000040;
    522 
    523     /**
    524      * Characteristic value signifying that the source guarantees that
    525      * encountered elements will not be {@code null}. (This applies,
    526      * for example, to most concurrent collections, queues, and maps.)
    527      */
    528     public static final int NONNULL    = 0x00000100;
    529 
    530     /**
    531      * Characteristic value signifying that the element source cannot be
    532      * structurally modified; that is, elements cannot be added, replaced, or
    533      * removed, so such changes cannot occur during traversal. A Spliterator
    534      * that does not report {@code IMMUTABLE} or {@code CONCURRENT} is expected
    535      * to have a documented policy (for example throwing
    536      * {@link ConcurrentModificationException}) concerning structural
    537      * interference detected during traversal.
    538      */
    539     public static final int IMMUTABLE  = 0x00000400;
    540 
    541     /**
    542      * Characteristic value signifying that the element source may be safely
    543      * concurrently modified (allowing additions, replacements, and/or removals)
    544      * by multiple threads without external synchronization. If so, the
    545      * Spliterator is expected to have a documented policy concerning the impact
    546      * of modifications during traversal.
    547      *
    548      * <p>A top-level Spliterator should not report both {@code CONCURRENT} and
    549      * {@code SIZED}, since the finite size, if known, may change if the source
    550      * is concurrently modified during traversal. Such a Spliterator is
    551      * inconsistent and no guarantees can be made about any computation using
    552      * that Spliterator. Sub-spliterators may report {@code SIZED} if the
    553      * sub-split size is known and additions or removals to the source are not
    554      * reflected when traversing.
    555      *
    556      * @apiNote Most concurrent collections maintain a consistency policy
    557      * guaranteeing accuracy with respect to elements present at the point of
    558      * Spliterator construction, but possibly not reflecting subsequent
    559      * additions or removals.
    560      */
    561     public static final int CONCURRENT = 0x00001000;
    562 
    563     /**
    564      * Characteristic value signifying that all Spliterators resulting from
    565      * {@code trySplit()} will be both {@link #SIZED} and {@link #SUBSIZED}.
    566      * (This means that all child Spliterators, whether direct or indirect, will
    567      * be {@code SIZED}.)
    568      *
    569      * <p>A Spliterator that does not report {@code SIZED} as required by
    570      * {@code SUBSIZED} is inconsistent and no guarantees can be made about any
    571      * computation using that Spliterator.
    572      *
    573      * @apiNote Some spliterators, such as the top-level spliterator for an
    574      * approximately balanced binary tree, will report {@code SIZED} but not
    575      * {@code SUBSIZED}, since it is common to know the size of the entire tree
    576      * but not the exact sizes of subtrees.
    577      */
    578     public static final int SUBSIZED = 0x00004000;
    579 
    580     /**
    581      * A Spliterator specialized for primitive values.
    582      *
    583      * @param <T> the type of elements returned by this Spliterator.  The
    584      * type must be a wrapper type for a primitive type, such as {@code Integer}
    585      * for the primitive {@code int} type.
    586      * @param  the type of primitive consumer.  The type must be a
    587      * primitive specialization of {@link java.util.function.Consumer} for
    588      * {@code T}, such as {@link java.util.function.IntConsumer} for
    589      * {@code Integer}.
    590      * @param  the type of primitive Spliterator.  The type must be
    591      * a primitive specialization of Spliterator for {@code T}, such as
    592      * {@link Spliterator.OfInt} for {@code Integer}.
    593      *
    594      * @see Spliterator.OfInt
    595      * @see Spliterator.OfLong
    596      * @see Spliterator.OfDouble
    597      * @since 1.8
    598      */
    599     public interface OfPrimitive<T, T_CONS, T_SPLITR extends Spliterator.OfPrimitive<T, T_CONS, T_SPLITR>>
    600             extends Spliterator<T> {
    601         @Override
    602         T_SPLITR trySplit();
    603 
    604         /**
    605          * If a remaining element exists, performs the given action on it,
    606          * returning {@code true}; else returns {@code false}.  If this
    607          * Spliterator is {@link #ORDERED} the action is performed on the
    608          * next element in encounter order.  Exceptions thrown by the
    609          * action are relayed to the caller.
    610          *
    611          * @param action The action
    612          * @return {@code false} if no remaining elements existed
    613          * upon entry to this method, else {@code true}.
    614          * @throws NullPointerException if the specified action is null
    615          */
    616         @SuppressWarnings("overloads")
    617         boolean tryAdvance(T_CONS action);
    618 
    619         /**
    620          * Performs the given action for each remaining element, sequentially in
    621          * the current thread, until all elements have been processed or the
    622          * action throws an exception.  If this Spliterator is {@link #ORDERED},
    623          * actions are performed in encounter order.  Exceptions thrown by the
    624          * action are relayed to the caller.
    625          *
    626          * @implSpec
    627          * The default implementation repeatedly invokes {@link #tryAdvance}
    628          * until it returns {@code false}.  It should be overridden whenever
    629          * possible.
    630          *
    631          * @param action The action
    632          * @throws NullPointerException if the specified action is null
    633          */
    634         @SuppressWarnings("overloads")
    635         default void forEachRemaining(T_CONS action) {
    636             do { } while (tryAdvance(action));
    637         }
    638     }
    639 
    640     /**
    641      * A Spliterator specialized for {@code int} values.
    642      * @since 1.8
    643      */
    644     public interface OfInt extends OfPrimitive<Integer, IntConsumer, OfInt> {
    645 
    646         @Override
    647         OfInt trySplit();
    648 
    649         @Override
    650         boolean tryAdvance(IntConsumer action);
    651 
    652         @Override
    653         default void forEachRemaining(IntConsumer action) {
    654             do { } while (tryAdvance(action));
    655         }
    656 
    657         /**
    658          * {@inheritDoc}
    659          * @implSpec
    660          * If the action is an instance of {@code IntConsumer} then it is cast
    661          * to {@code IntConsumer} and passed to
    662          * {@link #tryAdvance(java.util.function.IntConsumer)}; otherwise
    663          * the action is adapted to an instance of {@code IntConsumer}, by
    664          * boxing the argument of {@code IntConsumer}, and then passed to
    665          * {@link #tryAdvance(java.util.function.IntConsumer)}.
    666          */
    667         @Override
    668         default boolean tryAdvance(Consumer<? super Integer> action) {
    669             if (action instanceof IntConsumer) {
    670                 return tryAdvance((IntConsumer) action);
    671             }
    672             else {
    673                 if (Tripwire.ENABLED)
    674                     Tripwire.trip(getClass(),
    675                                   "{0} calling Spliterator.OfInt.tryAdvance((IntConsumer) action::accept)");
    676                 return tryAdvance((IntConsumer) action::accept);
    677             }
    678         }
    679 
    680         /**
    681          * {@inheritDoc}
    682          * @implSpec
    683          * If the action is an instance of {@code IntConsumer} then it is cast
    684          * to {@code IntConsumer} and passed to
    685          * {@link #forEachRemaining(java.util.function.IntConsumer)}; otherwise
    686          * the action is adapted to an instance of {@code IntConsumer}, by
    687          * boxing the argument of {@code IntConsumer}, and then passed to
    688          * {@link #forEachRemaining(java.util.function.IntConsumer)}.
    689          */
    690         @Override
    691         default void forEachRemaining(Consumer<? super Integer> action) {
    692             if (action instanceof IntConsumer) {
    693                 forEachRemaining((IntConsumer) action);
    694             }
    695             else {
    696                 if (Tripwire.ENABLED)
    697                     Tripwire.trip(getClass(),
    698                                   "{0} calling Spliterator.OfInt.forEachRemaining((IntConsumer) action::accept)");
    699                 forEachRemaining((IntConsumer) action::accept);
    700             }
    701         }
    702     }
    703 
    704     /**
    705      * A Spliterator specialized for {@code long} values.
    706      * @since 1.8
    707      */
    708     public interface OfLong extends OfPrimitive<Long, LongConsumer, OfLong> {
    709 
    710         @Override
    711         OfLong trySplit();
    712 
    713         @Override
    714         boolean tryAdvance(LongConsumer action);
    715 
    716         @Override
    717         default void forEachRemaining(LongConsumer action) {
    718             do { } while (tryAdvance(action));
    719         }
    720 
    721         /**
    722          * {@inheritDoc}
    723          * @implSpec
    724          * If the action is an instance of {@code LongConsumer} then it is cast
    725          * to {@code LongConsumer} and passed to
    726          * {@link #tryAdvance(java.util.function.LongConsumer)}; otherwise
    727          * the action is adapted to an instance of {@code LongConsumer}, by
    728          * boxing the argument of {@code LongConsumer}, and then passed to
    729          * {@link #tryAdvance(java.util.function.LongConsumer)}.
    730          */
    731         @Override
    732         default boolean tryAdvance(Consumer<? super Long> action) {
    733             if (action instanceof LongConsumer) {
    734                 return tryAdvance((LongConsumer) action);
    735             }
    736             else {
    737                 if (Tripwire.ENABLED)
    738                     Tripwire.trip(getClass(),
    739                                   "{0} calling Spliterator.OfLong.tryAdvance((LongConsumer) action::accept)");
    740                 return tryAdvance((LongConsumer) action::accept);
    741             }
    742         }
    743 
    744         /**
    745          * {@inheritDoc}
    746          * @implSpec
    747          * If the action is an instance of {@code LongConsumer} then it is cast
    748          * to {@code LongConsumer} and passed to
    749          * {@link #forEachRemaining(java.util.function.LongConsumer)}; otherwise
    750          * the action is adapted to an instance of {@code LongConsumer}, by
    751          * boxing the argument of {@code LongConsumer}, and then passed to
    752          * {@link #forEachRemaining(java.util.function.LongConsumer)}.
    753          */
    754         @Override
    755         default void forEachRemaining(Consumer<? super Long> action) {
    756             if (action instanceof LongConsumer) {
    757                 forEachRemaining((LongConsumer) action);
    758             }
    759             else {
    760                 if (Tripwire.ENABLED)
    761                     Tripwire.trip(getClass(),
    762                                   "{0} calling Spliterator.OfLong.forEachRemaining((LongConsumer) action::accept)");
    763                 forEachRemaining((LongConsumer) action::accept);
    764             }
    765         }
    766     }
    767 
    768     /**
    769      * A Spliterator specialized for {@code double} values.
    770      * @since 1.8
    771      */
    772     public interface OfDouble extends OfPrimitive<Double, DoubleConsumer, OfDouble> {
    773 
    774         @Override
    775         OfDouble trySplit();
    776 
    777         @Override
    778         boolean tryAdvance(DoubleConsumer action);
    779 
    780         @Override
    781         default void forEachRemaining(DoubleConsumer action) {
    782             do { } while (tryAdvance(action));
    783         }
    784 
    785         /**
    786          * {@inheritDoc}
    787          * @implSpec
    788          * If the action is an instance of {@code DoubleConsumer} then it is
    789          * cast to {@code DoubleConsumer} and passed to
    790          * {@link #tryAdvance(java.util.function.DoubleConsumer)}; otherwise
    791          * the action is adapted to an instance of {@code DoubleConsumer}, by
    792          * boxing the argument of {@code DoubleConsumer}, and then passed to
    793          * {@link #tryAdvance(java.util.function.DoubleConsumer)}.
    794          */
    795         @Override
    796         default boolean tryAdvance(Consumer<? super Double> action) {
    797             if (action instanceof DoubleConsumer) {
    798                 return tryAdvance((DoubleConsumer) action);
    799             }
    800             else {
    801                 if (Tripwire.ENABLED)
    802                     Tripwire.trip(getClass(),
    803                                   "{0} calling Spliterator.OfDouble.tryAdvance((DoubleConsumer) action::accept)");
    804                 return tryAdvance((DoubleConsumer) action::accept);
    805             }
    806         }
    807 
    808         /**
    809          * {@inheritDoc}
    810          * @implSpec
    811          * If the action is an instance of {@code DoubleConsumer} then it is
    812          * cast to {@code DoubleConsumer} and passed to
    813          * {@link #forEachRemaining(java.util.function.DoubleConsumer)};
    814          * otherwise the action is adapted to an instance of
    815          * {@code DoubleConsumer}, by boxing the argument of
    816          * {@code DoubleConsumer}, and then passed to
    817          * {@link #forEachRemaining(java.util.function.DoubleConsumer)}.
    818          */
    819         @Override
    820         default void forEachRemaining(Consumer<? super Double> action) {
    821             if (action instanceof DoubleConsumer) {
    822                 forEachRemaining((DoubleConsumer) action);
    823             }
    824             else {
    825                 if (Tripwire.ENABLED)
    826                     Tripwire.trip(getClass(),
    827                                   "{0} calling Spliterator.OfDouble.forEachRemaining((DoubleConsumer) action::accept)");
    828                 forEachRemaining((DoubleConsumer) action::accept);
    829             }
    830         }
    831     }
    832 }
    833