Class FloatStream

    • Method Detail

      • rangeMap

        @SequentialOnly
        public abstract FloatStream rangeMap​(FloatBiPredicate sameRange,
                                             FloatBinaryOperator mapper)
        Note: copied from StreamEx: https://github.com/amaembo/streamex
        Returns a stream consisting of results of applying the given function to the ranges created from the source elements. This is a quasi-intermediate partial reduction operation.
        Parameters:
        sameRange - a non-interfering, stateless predicate to apply to the leftmost and next elements which returns true for elements which belong to the same range.
        mapper - a non-interfering, stateless function to apply to the range borders and produce the resulting element. If value was not merged to the interval, then mapper will receive the same value twice, otherwise it will receive the leftmost and the rightmost values which were merged to the range.
        Returns:
        See Also:
        collapse(FloatBiPredicate, FloatBinaryOperator), Stream.rangeMap(BiPredicate, BiFunction)
      • rangeMapToObj

        @SequentialOnly
        public abstract <T> Stream<T> rangeMapToObj​(FloatBiPredicate sameRange,
                                                    FloatBiFunction<T> mapper)
        Note: copied from StreamEx: https://github.com/amaembo/streamex
        Returns a stream consisting of results of applying the given function to the ranges created from the source elements. This is a quasi-intermediate partial reduction operation.
        Parameters:
        sameRange - a non-interfering, stateless predicate to apply to the leftmost and next elements which returns true for elements which belong to the same range.
        mapper - a non-interfering, stateless function to apply to the range borders and produce the resulting element. If value was not merged to the interval, then mapper will receive the same value twice, otherwise it will receive the leftmost and the rightmost values which were merged to the range.
        Returns:
        See Also:
        Stream.rangeMap(BiPredicate, BiFunction)
      • collapse

        @SequentialOnly
        public abstract Stream<FloatList> collapse​(FloatBiPredicate collapsible)
        Merge series of adjacent elements which satisfy the given predicate using the merger function and return a new stream.
        This method only run sequentially, even in parallel stream.
        Parameters:
        collapsible -
        Returns:
      • collapse

        @SequentialOnly
        public abstract FloatStream collapse​(FloatBiPredicate collapsible,
                                             FloatBinaryOperator mergeFunction)
        Merge series of adjacent elements which satisfy the given predicate using the merger function and return a new stream.
        This method only run sequentially, even in parallel stream.
        Parameters:
        collapsible -
        mergeFunction -
        Returns:
      • scan

        @SequentialOnly
        public abstract FloatStream scan​(FloatBinaryOperator accumulator)
        Returns a Stream produced by iterative application of a accumulation function to an initial element init and next element of the current stream. Produces a Stream consisting of init, acc(init, value1), acc(acc(init, value1), value2), etc.

        This is an intermediate operation.

        Example:

         accumulator: (a, b) -> a + b
         stream: [1, 2, 3, 4, 5]
         result: [1, 3, 6, 10, 15]
         

        This method only run sequentially, even in parallel stream.
        Parameters:
        accumulator - the accumulation function
        Returns:
      • scan

        @SequentialOnly
        public abstract FloatStream scan​(float init,
                                         FloatBinaryOperator accumulator)
        Returns a Stream produced by iterative application of a accumulation function to an initial element init and next element of the current stream. Produces a Stream consisting of init, acc(init, value1), acc(acc(init, value1), value2), etc.

        This is an intermediate operation.

        Example:

         init:10
         accumulator: (a, b) -> a + b
         stream: [1, 2, 3, 4, 5]
         result: [11, 13, 16, 20, 25]
         

        This method only run sequentially, even in parallel stream.
        Parameters:
        init - the initial value. it's only used once by accumulator to calculate the fist element in the returned stream. It will be ignored if this stream is empty and won't be the first element of the returned stream.
        accumulator - the accumulation function
        Returns:
      • prepend

        public abstract FloatStream prepend​(float... a)
      • append

        public abstract FloatStream append​(float... a)
      • appendIfEmpty

        public abstract FloatStream appendIfEmpty​(float... a)
      • top

        @SequentialOnly
        public abstract FloatStream top​(int n)

        This method only run sequentially, even in parallel stream.
        Parameters:
        n -
        Returns:
      • toFloatList

        public abstract FloatList toFloatList()
      • kthLargest

        public abstract u.OptionalFloat kthLargest​(int k)
        Parameters:
        k -
        Returns:
        OptionalByte.empty() if there is no element or count less than k, otherwise the kth largest element.
      • sum

        public abstract double sum()
      • merge

        public abstract FloatStream merge​(FloatStream b,
                                          FloatBiFunction<MergeResult> nextSelector)
        Parameters:
        b -
        nextSelector - first parameter is selected if Nth.FIRST is returned, otherwise the second parameter is selected.
        Returns:
      • asDoubleStream

        public abstract DoubleStream asDoubleStream()
      • of

        public static FloatStream of​(float[] a,
                                     int startIndex,
                                     int endIndex)
      • of

        public static FloatStream of​(Float[] a,
                                     int startIndex,
                                     int endIndex)
      • flatten

        public static FloatStream flatten​(float[][] a)
      • flatten

        public static FloatStream flatten​(float[][] a,
                                          boolean vertically)
      • flatten

        public static FloatStream flatten​(float[][] a,
                                          float valueForNone,
                                          boolean vertically)
      • flatten

        public static FloatStream flatten​(float[][][] a)
      • repeat

        public static FloatStream repeat​(float element,
                                         long n)
      • iterate

        public static FloatStream iterate​(float init,
                                          FloatPredicate hasNext,
                                          FloatUnaryOperator f)
        Parameters:
        init -
        hasNext - test if has next by hasNext.test(init) for first time and hasNext.test(f.apply(previous)) for remaining.
        f -
        Returns:
      • zip

        public static FloatStream zip​(float[] a,
                                      float[] b,
                                      FloatBinaryOperator zipFunction)
        Zip together the "a" and "b" arrays until one of them runs out of values. Each pair of values is combined into a single value using the supplied zipFunction function.
        Parameters:
        a -
        b -
        Returns:
      • zip

        public static FloatStream zip​(float[] a,
                                      float[] b,
                                      float[] c,
                                      FloatTernaryOperator zipFunction)
        Zip together the "a", "b" and "c" arrays until one of them runs out of values. Each triple of values is combined into a single value using the supplied zipFunction function.
        Parameters:
        a -
        b -
        c -
        Returns:
      • zip

        public static FloatStream zip​(FloatIterator a,
                                      FloatIterator b,
                                      FloatBinaryOperator zipFunction)
        Zip together the "a" and "b" iterators until one of them runs out of values. Each pair of values is combined into a single value using the supplied zipFunction function.
        Parameters:
        a -
        b -
        Returns:
      • zip

        public static FloatStream zip​(FloatStream a,
                                      FloatStream b,
                                      FloatBinaryOperator zipFunction)
        Zip together the "a" and "b" streams until one of them runs out of values. Each pair of values is combined into a single value using the supplied zipFunction function.
        Parameters:
        a -
        b -
        Returns:
      • zip

        public static FloatStream zip​(FloatStream a,
                                      FloatStream b,
                                      FloatStream c,
                                      FloatTernaryOperator zipFunction)
        Zip together the "a", "b" and "c" streams until one of them runs out of values. Each triple of values is combined into a single value using the supplied zipFunction function.
        Parameters:
        a -
        b -
        Returns:
      • zip

        public static FloatStream zip​(Collection<? extends FloatStream> c,
                                      FloatNFunction<Float> zipFunction)
        Zip together the iterators until one of them runs out of values. Each array of values is combined into a single value using the supplied zipFunction function.
        Parameters:
        c -
        zipFunction -
        Returns:
      • zip

        public static FloatStream zip​(float[] a,
                                      float[] b,
                                      float valueForNoneA,
                                      float valueForNoneB,
                                      FloatBinaryOperator zipFunction)
        Zip together the "a" and "b" iterators until all of them runs out of values. Each pair of values is combined into a single value using the supplied zipFunction function.
        Parameters:
        a -
        b -
        valueForNoneA - value to fill if "a" runs out of values first.
        valueForNoneB - value to fill if "b" runs out of values first.
        zipFunction -
        Returns:
      • zip

        public static FloatStream zip​(float[] a,
                                      float[] b,
                                      float[] c,
                                      float valueForNoneA,
                                      float valueForNoneB,
                                      float valueForNoneC,
                                      FloatTernaryOperator zipFunction)
        Zip together the "a", "b" and "c" iterators until all of them runs out of values. Each triple of values is combined into a single value using the supplied zipFunction function.
        Parameters:
        a -
        b -
        c -
        valueForNoneA - value to fill if "a" runs out of values.
        valueForNoneB - value to fill if "b" runs out of values.
        valueForNoneC - value to fill if "c" runs out of values.
        zipFunction -
        Returns:
      • zip

        public static FloatStream zip​(FloatIterator a,
                                      FloatIterator b,
                                      float valueForNoneA,
                                      float valueForNoneB,
                                      FloatBinaryOperator zipFunction)
        Zip together the "a" and "b" iterators until all of them runs out of values. Each pair of values is combined into a single value using the supplied zipFunction function.
        Parameters:
        a -
        b -
        valueForNoneA - value to fill if "a" runs out of values first.
        valueForNoneB - value to fill if "b" runs out of values first.
        zipFunction -
        Returns:
      • zip

        public static FloatStream zip​(FloatIterator a,
                                      FloatIterator b,
                                      FloatIterator c,
                                      float valueForNoneA,
                                      float valueForNoneB,
                                      float valueForNoneC,
                                      FloatTernaryOperator zipFunction)
        Zip together the "a", "b" and "c" iterators until all of them runs out of values. Each triple of values is combined into a single value using the supplied zipFunction function.
        Parameters:
        a -
        b -
        c -
        valueForNoneA - value to fill if "a" runs out of values.
        valueForNoneB - value to fill if "b" runs out of values.
        valueForNoneC - value to fill if "c" runs out of values.
        zipFunction -
        Returns:
      • zip

        public static FloatStream zip​(FloatStream a,
                                      FloatStream b,
                                      float valueForNoneA,
                                      float valueForNoneB,
                                      FloatBinaryOperator zipFunction)
        Zip together the "a" and "b" iterators until all of them runs out of values. Each pair of values is combined into a single value using the supplied zipFunction function.
        Parameters:
        a -
        b -
        valueForNoneA - value to fill if "a" runs out of values first.
        valueForNoneB - value to fill if "b" runs out of values first.
        zipFunction -
        Returns:
      • zip

        public static FloatStream zip​(FloatStream a,
                                      FloatStream b,
                                      FloatStream c,
                                      float valueForNoneA,
                                      float valueForNoneB,
                                      float valueForNoneC,
                                      FloatTernaryOperator zipFunction)
        Zip together the "a", "b" and "c" iterators until all of them runs out of values. Each triple of values is combined into a single value using the supplied zipFunction function.
        Parameters:
        a -
        b -
        c -
        valueForNoneA - value to fill if "a" runs out of values.
        valueForNoneB - value to fill if "b" runs out of values.
        valueForNoneC - value to fill if "c" runs out of values.
        zipFunction -
        Returns:
      • zip

        public static FloatStream zip​(Collection<? extends FloatStream> c,
                                      float[] valuesForNone,
                                      FloatNFunction<Float> zipFunction)
        Zip together the iterators until all of them runs out of values. Each array of values is combined into a single value using the supplied zipFunction function.
        Parameters:
        c -
        valuesForNone - value to fill for any iterator runs out of values.
        zipFunction -
        Returns:
      • merge

        public static FloatStream merge​(float[] a,
                                        float[] b,
                                        FloatBiFunction<MergeResult> nextSelector)
        Parameters:
        a -
        b -
        nextSelector - first parameter is selected if Nth.FIRST is returned, otherwise the second parameter is selected.
        Returns:
      • merge

        public static FloatStream merge​(float[] a,
                                        float[] b,
                                        float[] c,
                                        FloatBiFunction<MergeResult> nextSelector)
        Parameters:
        a -
        b -
        c -
        nextSelector - first parameter is selected if Nth.FIRST is returned, otherwise the second parameter is selected.
        Returns:
      • parallelMerge

        public static FloatStream parallelMerge​(Collection<? extends FloatStream> c,
                                                FloatBiFunction<MergeResult> nextSelector,
                                                int maxThreadNum)
        Parameters:
        c -
        nextSelector - first parameter is selected if Nth.FIRST is returned, otherwise the second parameter is selected.
        maxThreadNum -
        Returns:
      • carry

        public S carry​(C action)
        Description copied from interface: BaseStream
        Same as peek
        Specified by:
        carry in interface BaseStream<T,​A,​P,​C,​PL,​OT,​IT,​ITER,​S extends com.landawn.abacus.util.stream.StreamBase<T,​A,​P,​C,​PL,​OT,​IT,​ITER,​S>>
        Returns:
        See Also:
        BaseStream.peek(Object)
      • sliding

        public Stream<S> sliding​(int windowSize)
        Specified by:
        sliding in interface BaseStream<T,​A,​P,​C,​PL,​OT,​IT,​ITER,​S extends com.landawn.abacus.util.stream.StreamBase<T,​A,​P,​C,​PL,​OT,​IT,​ITER,​S>>
        Returns:
        See Also:
        BaseStream.sliding(int, int)
      • slidingToList

        public Stream<PL> slidingToList​(int windowSize)
        Specified by:
        slidingToList in interface BaseStream<T,​A,​P,​C,​PL,​OT,​IT,​ITER,​S extends com.landawn.abacus.util.stream.StreamBase<T,​A,​P,​C,​PL,​OT,​IT,​ITER,​S>>
        Returns:
        See Also:
        BaseStream.sliding(int, int)
      • shuffled

        public S shuffled()
        Description copied from interface: BaseStream

        This method only run sequentially, even in parallel stream and all elements will be loaded to memory.
        Specified by:
        shuffled in interface BaseStream<T,​A,​P,​C,​PL,​OT,​IT,​ITER,​S extends com.landawn.abacus.util.stream.StreamBase<T,​A,​P,​C,​PL,​OT,​IT,​ITER,​S>>
        Returns:
      • toImmutableList

        public ImmutableList<T> toImmutableList()
        Specified by:
        toImmutableList in interface BaseStream<T,​A,​P,​C,​PL,​OT,​IT,​ITER,​S extends com.landawn.abacus.util.stream.StreamBase<T,​A,​P,​C,​PL,​OT,​IT,​ITER,​S>>
      • toImmutableSet

        public ImmutableSet<T> toImmutableSet()
        Specified by:
        toImmutableSet in interface BaseStream<T,​A,​P,​C,​PL,​OT,​IT,​ITER,​S extends com.landawn.abacus.util.stream.StreamBase<T,​A,​P,​C,​PL,​OT,​IT,​ITER,​S>>
      • join

        public String join​(CharSequence delimiter)
        Specified by:
        join in interface BaseStream<T,​A,​P,​C,​PL,​OT,​IT,​ITER,​S extends com.landawn.abacus.util.stream.StreamBase<T,​A,​P,​C,​PL,​OT,​IT,​ITER,​S>>
      • println

        public void println()
        Specified by:
        println in interface BaseStream<T,​A,​P,​C,​PL,​OT,​IT,​ITER,​S extends com.landawn.abacus.util.stream.StreamBase<T,​A,​P,​C,​PL,​OT,​IT,​ITER,​S>>
      • isParallel

        public boolean isParallel()
        Specified by:
        isParallel in interface BaseStream<T,​A,​P,​C,​PL,​OT,​IT,​ITER,​S extends com.landawn.abacus.util.stream.StreamBase<T,​A,​P,​C,​PL,​OT,​IT,​ITER,​S>>
        Returns:
      • sequential

        public S sequential()
        Specified by:
        sequential in interface BaseStream<T,​A,​P,​C,​PL,​OT,​IT,​ITER,​S extends com.landawn.abacus.util.stream.StreamBase<T,​A,​P,​C,​PL,​OT,​IT,​ITER,​S>>
        Returns:
      • parallel

        public S parallel()
        Specified by:
        parallel in interface BaseStream<T,​A,​P,​C,​PL,​OT,​IT,​ITER,​S extends com.landawn.abacus.util.stream.StreamBase<T,​A,​P,​C,​PL,​OT,​IT,​ITER,​S>>
        Returns:
      • parallel

        public S parallel​(int maxThreadNum)
        Specified by:
        parallel in interface BaseStream<T,​A,​P,​C,​PL,​OT,​IT,​ITER,​S extends com.landawn.abacus.util.stream.StreamBase<T,​A,​P,​C,​PL,​OT,​IT,​ITER,​S>>
        Returns:
      • parallel

        public S parallel​(BaseStream.Splitor splitor)
        Specified by:
        parallel in interface BaseStream<T,​A,​P,​C,​PL,​OT,​IT,​ITER,​S extends com.landawn.abacus.util.stream.StreamBase<T,​A,​P,​C,​PL,​OT,​IT,​ITER,​S>>
        Returns:
      • parallel

        public S parallel​(int maxThreadNum,
                          BaseStream.Splitor splitor)
        Description copied from interface: BaseStream
        Returns an equivalent stream that is parallel. May return itself if the stream was already parallel with the same maxThreadNum and splitor as the specified ones.

        When to use parallel Streams?
         
         Profiler.run(1, 1, 3, "sequential", () -> Stream.of(list).operation(F)...).printResult();
         Profiler.run(1, 1, 3, "parallel", () -> Stream.of(list).parallel().operation(F)...).printResult();
         
         
        Here is a sample performance test with computer: CPU Intel i7-3520M 4-cores 2.9 GHz, JDK 1.8.0_101, Windows 7:
         
         public void test_perf() {
             final String[] strs = new String[10_000];
             N.fill(strs, N.uuid());
        
             final int m = 1;
             final Function mapper = str -> {
                 long result = 0;
                 for (int i = 0; i < m; i++) {
                     result += sum(str.toCharArray()) + 1;
                 }
                 return result;
             };
        
             final MutableLong sum = MutableLong.of(0);
        
             for (int i = 0, len = strs.length; i < len; i++) {
                 sum.add(mapper.apply(strs[i]));
             }
        
             final int threadNum = 1, loopNum = 100, roundNum = 3;
        
             Profiler.run(threadNum, loopNum, roundNum, "For Loop", () -> {
                 long result = 0;
                 for (int i = 0, len = strs.length; i < len; i++) {
                     result += mapper.apply(strs[i]);
                 }
                 assertEquals(sum.longValue(), result);
             }).printResult();
        
             Profiler.run(threadNum, loopNum, roundNum, "JDK Sequential",
                     () -> assertEquals(sum.longValue(), java.util.stream.Stream.of(strs).map(mapper).mapToLong(e -> e).sum())).printResult();
        
             Profiler.run(threadNum, loopNum, roundNum, "JDK Parallel",
                     () -> assertEquals(sum.longValue(), java.util.stream.Stream.of(strs).parallel().map(mapper).mapToLong(e -> e).sum())).printResult();
        
             Profiler.run(threadNum, loopNum, roundNum, "Abcus Sequential",
                     () -> assertEquals(sum.longValue(), Stream.of(strs).map(mapper).mapToLong(e -> e).sum().longValue())).printResult();
        
             Profiler.run(threadNum, loopNum, roundNum, "Abcus Parallel",
                     () -> assertEquals(sum.longValue(), Stream.of(strs).parallel().map(mapper).mapToLong(e -> e).sum().longValue())).printResult();
         }
         
         
        And test result: Unit is milliseconds. N(the number of elements) is 10_000, Q(cost per element of F, the per-element function (usually a lambda), here is mapper) is calculated by: value of 'For loop' / N(10_000).
        m = 1 m = 10m = 50m = 100m = 500m = 1000
        Q 0.000020.00020.0010.0020.010.02
        For Loop0.232.31122110219
        JDK Sequential0.282.31122114212
        JDK Parallel0.221.361266122
        Abcus Sequential0.321122112212
        Abcus Parallel1111111677128
        Comparison:
        • Again, do NOT and should NOT use parallel Streams if you don't have any performance problem with sequential Streams, because using parallel Streams has extra cost.
        • Again, consider using parallel Streams only when N(the number of elements) * Q(cost per element of F, the per-element function (usually a lambda)) is big enough.
        • The implementation of parallel Streams in Abacus is more than 10 times, slower than parallel Streams in JDK when Q is tiny(here is less than 0.0002 milliseconds by the test):
          • The implementation of parallel Streams in JDK 8 still can beat the sequential/for loop when Q is tiny(Here is 0.00002 milliseconds by the test). That's amazing, considering the extra cost brought by parallel computation. It's well done.
          • The implementation of parallel Streams in Abacus is pretty simple and straight forward. The extra cost(starting threads/synchronization/queue...) brought by parallel Streams in Abacus is too bigger to tiny Q(Here is less than 0.001 milliseconds by the test). But it starts to be faster than sequential Streams when Q is big enough(Here is 0.001 milliseconds by the test) and starts to catch the parallel Streams in JDK when Q is bigger(Here is 0.01 milliseconds by the test).
          • Consider using the parallel Streams in Abacus when Q is big enough, specially when IO involved in F. Because one IO operation(e.g. DB/web service request..., Reading/Writing file...) usually takes 1 to 1000 milliseconds, or even longer. By the parallel Streams APIs in Abacus, it's very simple to specify max thread numbers. Sometimes, it's much faster to execute IO/Network requests with a bit more threads. It's fair to say that the parallel Streams in Abacus is high efficient, may same as or faster than the parallel Streams in JDK when Q is big enough, except F is heavy cpu-used operation. Most of the times, the Q is big enough to consider using parallel Stream is because IO/Network is involved in F.
        • JDK 7 is supported by the Streams in Abacus. It's perfect to work with retrolambda on Android
        • All primitive types are supported by Stream APIs in Abacus except boolean


        A bit more about Lambdas/Stream APIs, you may heard that Lambdas/Stream APIs is 5 time slower than imperative programming. It's true when Q and F is VERY, VERY tiny, like f = (int a, int b) -> a + b;. But if we look into the samples in the article and think about it: it just takes less than 1 milliseconds to get the max value in 100k numbers. There is potential performance issue only if the "get the max value in 100K numbers" call many, many times in your API or single request. Otherwise, the difference between 0.1 milliseconds to 0.5 milliseconds can be totally ignored. Usually we meet performance issue only if Q and F is big enough. However, the performance of Lambdas/Streams APIs is closed to for loop when Q and F is big enough. No matter in which scenario, We don't need and should not concern the performance of Lambdas/Stream APIs.

        Although it's is parallel Streams, it doesn't means all the methods are executed in parallel. Because the sequential way is as fast, or even faster than the parallel way for some methods, or is pretty difficult, if not possible, to implement the method by parallel approach. Here are the methods which are executed sequentially even in parallel Streams.

        splitXXX/splitAt/splitBy/slidingXXX/collapse, distinct, reverse, rotate, shuffle, indexed, cached, top, kthLargest, count, toArray, toList, toList, toSet, toMultiset, toLongMultiset, intersection(Collection c), difference(Collection c), symmetricDifference(Collection c), forEach(identity, accumulator, predicate), findFirstOrLast, findFirstAndLast
        Specified by:
        parallel in interface BaseStream<T,​A,​P,​C,​PL,​OT,​IT,​ITER,​S extends com.landawn.abacus.util.stream.StreamBase<T,​A,​P,​C,​PL,​OT,​IT,​ITER,​S>>
        Parameters:
        maxThreadNum - Default value is the number of cpu-cores. Steps/operations will be executed sequentially if maxThreadNum is 1.
        splitor - The target array is split by ranges for multiple threads if splitor is splitor.ARRAY and target stream composed by array. It looks like:
        
         for (int i = 0; i < maxThreadNum; i++) {
             final int sliceIndex = i;
        
             futureList.add(asyncExecutor.execute(new Runnable() {
                 public void run() {
                     int cursor = fromIndex + sliceIndex * sliceSize;
                     final int to = toIndex - cursor > sliceSize ? cursor + sliceSize : toIndex;
                     while (cursor < to) {
                         action.accept(elements[cursor++]);
                     }
                }
            }));
         }
         
        Otherwise, each thread will get the elements from the target array/iterator in the stream one by one with the target array/iterator synchronized. It looks like:
        
         for (int i = 0; i < maxThreadNum; i++) {
             futureList.add(asyncExecutor.execute(new Runnable() {
                 public void run() {
                     T next = null;
        
                     while (true) {
                         synchronized (elements) {
                             if (cursor.intValue() < toIndex) {
                                 next = elements[cursor.getAndIncrement()];
                             } else {
                                 break;
                             }
                         }
        
                         action.accept(next);
                     }
                 }
             }));
         }
         
        Using splitor.ARRAY only when F (the per-element function (usually a lambda)) is very tiny and the cost of synchronization on the target array/iterator is too big to it. For the F involving IO or taking 'long' to complete, choose splitor.ITERATOR. Default value is splitor.ITERATOR.
        Returns:
        See Also:
        MergeResult, com.landawn.abacus.util.Profiler#run(int, int, int, String, Runnable), Understanding Parallel Stream Performance in Java SE 8, When to use parallel Streams
      • parallel

        public S parallel​(int maxThreadNum,
                          BaseStream.Splitor splitor,
                          Executor executor)
        Specified by:
        parallel in interface BaseStream<T,​A,​P,​C,​PL,​OT,​IT,​ITER,​S extends com.landawn.abacus.util.stream.StreamBase<T,​A,​P,​C,​PL,​OT,​IT,​ITER,​S>>
        executor - should be able to execute maxThreadNum * following up operations in parallel.
        Returns:
      • parallel

        public S parallel​(int maxThreadNum,
                          Executor executor)
        Specified by:
        parallel in interface BaseStream<T,​A,​P,​C,​PL,​OT,​IT,​ITER,​S extends com.landawn.abacus.util.stream.StreamBase<T,​A,​P,​C,​PL,​OT,​IT,​ITER,​S>>
        executor - should be able to execute maxThreadNum * following up operations in parallel.
        Returns:
      • parallel

        public S parallel​(Executor executor)
        Specified by:
        parallel in interface BaseStream<T,​A,​P,​C,​PL,​OT,​IT,​ITER,​S extends com.landawn.abacus.util.stream.StreamBase<T,​A,​P,​C,​PL,​OT,​IT,​ITER,​S>>
        Parameters:
        executor - should be able to execute maxThreadNum * following up operations in parallel.
        Returns:
      • close

        public void close()
        Specified by:
        close in interface AutoCloseable
        Specified by:
        close in interface BaseStream<T,​A,​P,​C,​PL,​OT,​IT,​ITER,​S extends com.landawn.abacus.util.stream.StreamBase<T,​A,​P,​C,​PL,​OT,​IT,​ITER,​S>>