
com.landawn.abacus.util.stream.Stream Maven / Gradle / Ivy
/*
* Copyright (C) 2016, 2017, 2018, 2019 HaiYang Li
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package com.landawn.abacus.util.stream;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.io.Reader;
import java.io.Writer;
import java.nio.charset.Charset;
import java.nio.file.Path;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Queue;
import java.util.Set;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import com.landawn.abacus.DataSet;
import com.landawn.abacus.annotation.Beta;
import com.landawn.abacus.util.AsyncExecutor;
import com.landawn.abacus.util.ByteIterator;
import com.landawn.abacus.util.CharIterator;
import com.landawn.abacus.util.Charsets;
import com.landawn.abacus.util.ContinuableFuture;
import com.landawn.abacus.util.DateUtil;
import com.landawn.abacus.util.DoubleIterator;
import com.landawn.abacus.util.Duration;
import com.landawn.abacus.util.FloatIterator;
import com.landawn.abacus.util.Fn;
import com.landawn.abacus.util.Fn.Suppliers;
import com.landawn.abacus.util.IOUtil;
import com.landawn.abacus.util.ImmutableMap;
import com.landawn.abacus.util.Indexed;
import com.landawn.abacus.util.IntIterator;
import com.landawn.abacus.util.IntList;
import com.landawn.abacus.util.Keyed;
import com.landawn.abacus.util.LineIterator;
import com.landawn.abacus.util.ListMultimap;
import com.landawn.abacus.util.LongIterator;
import com.landawn.abacus.util.Matrix;
import com.landawn.abacus.util.Multimap;
import com.landawn.abacus.util.MutableBoolean;
import com.landawn.abacus.util.MutableInt;
import com.landawn.abacus.util.N;
import com.landawn.abacus.util.Nth;
import com.landawn.abacus.util.ObjIterator;
import com.landawn.abacus.util.Pair;
import com.landawn.abacus.util.Percentage;
import com.landawn.abacus.util.ShortIterator;
import com.landawn.abacus.util.Try;
import com.landawn.abacus.util.u.Holder;
import com.landawn.abacus.util.u.Optional;
import com.landawn.abacus.util.u.OptionalDouble;
import com.landawn.abacus.util.function.BiConsumer;
import com.landawn.abacus.util.function.BiFunction;
import com.landawn.abacus.util.function.BiPredicate;
import com.landawn.abacus.util.function.BinaryOperator;
import com.landawn.abacus.util.function.BooleanSupplier;
import com.landawn.abacus.util.function.ByteBiFunction;
import com.landawn.abacus.util.function.ByteNFunction;
import com.landawn.abacus.util.function.ByteTriFunction;
import com.landawn.abacus.util.function.CharBiFunction;
import com.landawn.abacus.util.function.CharNFunction;
import com.landawn.abacus.util.function.CharTriFunction;
import com.landawn.abacus.util.function.Consumer;
import com.landawn.abacus.util.function.DoubleBiFunction;
import com.landawn.abacus.util.function.DoubleNFunction;
import com.landawn.abacus.util.function.DoubleTriFunction;
import com.landawn.abacus.util.function.FloatBiFunction;
import com.landawn.abacus.util.function.FloatNFunction;
import com.landawn.abacus.util.function.FloatTriFunction;
import com.landawn.abacus.util.function.Function;
import com.landawn.abacus.util.function.IntBiFunction;
import com.landawn.abacus.util.function.IntFunction;
import com.landawn.abacus.util.function.IntNFunction;
import com.landawn.abacus.util.function.IntTriFunction;
import com.landawn.abacus.util.function.LongBiFunction;
import com.landawn.abacus.util.function.LongFunction;
import com.landawn.abacus.util.function.LongNFunction;
import com.landawn.abacus.util.function.LongSupplier;
import com.landawn.abacus.util.function.LongTriFunction;
import com.landawn.abacus.util.function.Predicate;
import com.landawn.abacus.util.function.ShortBiFunction;
import com.landawn.abacus.util.function.ShortNFunction;
import com.landawn.abacus.util.function.ShortTriFunction;
import com.landawn.abacus.util.function.Supplier;
import com.landawn.abacus.util.function.ToByteFunction;
import com.landawn.abacus.util.function.ToCharFunction;
import com.landawn.abacus.util.function.ToDoubleFunction;
import com.landawn.abacus.util.function.ToFloatFunction;
import com.landawn.abacus.util.function.ToIntFunction;
import com.landawn.abacus.util.function.ToLongFunction;
import com.landawn.abacus.util.function.ToShortFunction;
import com.landawn.abacus.util.function.TriFunction;
import com.landawn.abacus.util.function.UnaryOperator;
import com.landawn.abacus.util.stream.ObjIteratorEx.QueuedIterator;
/**
* Note: This class includes codes copied from StreamEx: https://github.com/amaembo/streamex under Apache License, version 2.0.
*
*
* The Stream will be automatically closed after execution(A terminal method is executed/triggered).
*
* @param the type of the stream elements
* @see IntStream
* @see LongStream
* @see DoubleStream
*/
public abstract class Stream
extends StreamBase, Consumer super T>, List, Optional, Indexed, ObjIterator, Stream> {
Stream(final boolean sorted, final Comparator super T> cmp, final Collection closeHandlers) {
super(sorted, cmp, closeHandlers);
}
@SequentialOnly
public Stream select(Class targetType) {
if (isParallel()) {
return (Stream) sequential().filter(Fn.instanceOf(targetType)).parallel(maxThreadNum(), splitor());
} else {
return (Stream) filter(Fn.instanceOf(targetType));
}
}
@ParallelSupported
public abstract Stream map(Function super T, ? extends R> mapper);
// public abstract Stream biMap(BiFunction super T, ? super T, ? extends R> mapper);
//
// /**
// * Returns a stream consisting of the results of applying the given function
// * to the every two adjacent elements of this stream.
// *
// *
// *
// * Stream.of("a", "b", "c", "d", "e").biMap((i, j) -> i + "-" + j).println();
// * // print out: [a-b, c-d, e-null]
// *
// *
// *
// * @param mapper
// * @param ignoreNotPaired flag to identify if need to ignore the last element when the total length of the stream is odd number. Default value is false
// * @return
// */
// public abstract Stream biMap(BiFunction super T, ? super T, ? extends R> mapper, boolean ignoreNotPaired);
//
// public abstract Stream triMap(TriFunction super T, ? super T, ? super T, ? extends R> mapper);
//
// /**
// * Returns a stream consisting of the results of applying the given function
// * to the every three adjacent elements of this stream.
// *
// *
// *
// * Stream.of("a", "b", "c", "d", "e").triMap((i, j, k) -> i + "-" + j + "-" + k).println();
// * // print out: [a-b-c, d-e-null]
// *
// *
// *
// * @param mapper
// * @param ignoreNotPaired flag to identify if need to ignore the last one or two elements when the total length of the stream is not multiple of 3. Default value is false
// * @return
// */
// public abstract Stream triMap(TriFunction super T, ? super T, ? super T, ? extends R> mapper, boolean ignoreNotPaired);
@ParallelSupported
public abstract Stream slidingMap(BiFunction super T, ? super T, R> mapper);
/**
* Slide with windowSize = 2
and the specified increment
, then map
by the specified mapper
.
*
* @param mapper
* @param increment
* @return
*/
@ParallelSupported
public abstract Stream slidingMap(BiFunction super T, ? super T, R> mapper, int increment);
@ParallelSupported
public abstract Stream slidingMap(BiFunction super T, ? super T, R> mapper, int increment, boolean ignoreNotPaired);
@ParallelSupported
public abstract Stream slidingMap(TriFunction super T, ? super T, ? super T, R> mapper);
/**
* Slide with windowSize = 3
and the specified increment
, then map
by the specified mapper
.
*
* @param mapper
* @param increment
* @return
*/
@ParallelSupported
public abstract Stream slidingMap(TriFunction super T, ? super T, ? super T, R> mapper, int increment);
@ParallelSupported
public abstract Stream slidingMap(TriFunction super T, ? super T, ? super T, R> mapper, int increment, boolean ignoreNotPaired);
/**
* 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.
*
*
*
* Stream.of("a", "ab", "ac", "b", "c", "cb").rangeMap((a, b) -> b.startsWith(a), (a, b) -> a + "->" + b).toList(); // a->ac, b->b, c->cb
*
*
*
*
* This is a quasi-intermediate
* partial reduction operation.
*
* @param the type of the resulting elements
* @param 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.
* @param 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.
* @return the new stream
* @see #collapse(BiPredicate, BinaryOperator)
*/
@SequentialOnly
public abstract Stream rangeMap(final BiPredicate super T, ? super T> sameRange, final BiFunction super T, ? super T, ? extends U> mapper);
@ParallelSupported
public abstract Stream mapFirst(Function super T, ? extends T> mapperForFirst);
@ParallelSupported
public abstract Stream mapFirstOrElse(Function super T, ? extends R> mapperForFirst, Function super T, ? extends R> mapperForElse);
@ParallelSupported
public abstract Stream mapLast(Function super T, ? extends T> mapperForLast);
@ParallelSupported
public abstract Stream mapLastOrElse(Function super T, ? extends R> mapperForLast, Function super T, ? extends R> mapperForElse);
@ParallelSupported
public abstract CharStream mapToChar(ToCharFunction super T> mapper);
@ParallelSupported
public abstract ByteStream mapToByte(ToByteFunction super T> mapper);
@ParallelSupported
public abstract ShortStream mapToShort(ToShortFunction super T> mapper);
@ParallelSupported
public abstract IntStream mapToInt(ToIntFunction super T> mapper);
@ParallelSupported
public abstract LongStream mapToLong(ToLongFunction super T> mapper);
@ParallelSupported
public abstract FloatStream mapToFloat(ToFloatFunction super T> mapper);
@ParallelSupported
public abstract DoubleStream mapToDouble(ToDoubleFunction super T> mapper);
// public abstract EntryStream mapToEntry();
@ParallelSupported
public abstract EntryStream mapToEntry(Function super T, ? extends Map.Entry> mapper);
@ParallelSupported
public abstract EntryStream mapToEntry(Function super T, K> keyMapper, Function super T, V> valueMapper);
// public abstract Stream mapp(Function super T, ? extends Optional extends U>> mapper);
@ParallelSupported
public abstract Stream flatMap(Function super T, ? extends Stream extends R>> mapper);
@ParallelSupported
public abstract Stream flattMap(Function super T, ? extends Collection extends R>> mapper);
@ParallelSupported
public abstract Stream flatMapp(Function super T, R[]> mapper);
@ParallelSupported
public abstract CharStream flatMapToChar(Function super T, ? extends CharStream> mapper);
@ParallelSupported
public abstract CharStream flattMapToChar(Function super T, char[]> mapper);
@ParallelSupported
public abstract ByteStream flatMapToByte(Function super T, ? extends ByteStream> mapper);
@ParallelSupported
public abstract ByteStream flattMapToByte(Function super T, byte[]> mapper);
@ParallelSupported
public abstract ShortStream flatMapToShort(Function super T, ? extends ShortStream> mapper);
@ParallelSupported
public abstract ShortStream flattMapToShort(Function super T, short[]> mapper);
@ParallelSupported
public abstract IntStream flatMapToInt(Function super T, ? extends IntStream> mapper);
@ParallelSupported
public abstract IntStream flattMapToInt(Function super T, int[]> mapper);
@ParallelSupported
public abstract LongStream flatMapToLong(Function super T, ? extends LongStream> mapper);
@ParallelSupported
public abstract LongStream flattMapToLong(Function super T, long[]> mapper);
@ParallelSupported
public abstract FloatStream flatMapToFloat(Function super T, ? extends FloatStream> mapper);
@ParallelSupported
public abstract FloatStream flattMapToFloat(Function super T, float[]> mapper);
@ParallelSupported
public abstract DoubleStream flatMapToDouble(Function super T, ? extends DoubleStream> mapper);
@ParallelSupported
public abstract DoubleStream flattMapToDouble(Function super T, double[]> mapper);
@ParallelSupported
public abstract EntryStream flatMapToEntry(Function super T, ? extends Stream extends Map.Entry>> mapper);
@ParallelSupported
public abstract EntryStream flattMapToEntry(Function super T, ? extends Map> mapper);
@ParallelSupported
public abstract EntryStream flatMappToEntry(Function super T, ? extends EntryStream> mapper);
@ParallelSupported
public abstract Stream>> groupBy(final Function super T, ? extends K> classifier);
@ParallelSupported
public abstract Stream>> groupBy(final Function super T, ? extends K> classifier,
final Supplier extends Map>> mapFactory);
/**
*
* @param classifier
* @param valueMapper
* @return
* @see Collectors#toMultimap(Function, Function)
*/
@ParallelSupported
public abstract Stream>> groupBy(Function super T, ? extends K> classifier, Function super T, ? extends U> valueMapper);
/**
*
* @param classifier
* @param valueMapper
* @param mapFactory
* @return
* @see Collectors#toMultimap(Function, Function, Supplier)
*/
@ParallelSupported
public abstract Stream>> groupBy(Function super T, ? extends K> classifier, Function super T, ? extends U> valueMapper,
Supplier extends Map>> mapFactory);
@ParallelSupported
public abstract Stream> groupBy(final Function super T, ? extends K> classifier, final Collector super T, A, D> downstream);
@ParallelSupported
public abstract Stream> groupBy(final Function super T, ? extends K> classifier, final Collector super T, A, D> downstream,
final Supplier extends Map> mapFactory);
@ParallelSupported
public abstract Stream> groupBy(final Function super T, ? extends K> classifier,
final Function super T, ? extends U> valueMapper, final Collector super U, A, D> downstream);
@ParallelSupported
public abstract Stream> groupBy(final Function super T, ? extends K> classifier,
final Function super T, ? extends U> valueMapper, final Collector super U, A, D> downstream, final Supplier extends Map> mapFactory);
@ParallelSupported
public abstract Stream> groupBy(final Function super T, ? extends K> classifier,
final Function super T, ? extends V> valueMapper, BinaryOperator mergeFunction);
@ParallelSupported
public abstract Stream> groupBy(final Function super T, ? extends K> classifier,
final Function super T, ? extends V> valueMapper, final BinaryOperator mergeFunction, final Supplier extends Map> mapFactory);
/**
*
* @param predicate
* @return
* @see Collectors#partitioningBy(Predicate)
*/
@ParallelSupported
public abstract Stream>> partitionBy(final Predicate super T> predicate);
/**
*
* @param predicate
* @param downstream
* @return
* @see Collectors#partitioningBy(Predicate, Collector)
*/
@ParallelSupported
public abstract Stream> partitionBy(final Predicate super T> predicate, final Collector super T, A, D> downstream);
@ParallelSupported
public Stream> countBy(final Function super T, ? extends K> classifier) {
return groupBy(classifier, Collectors.countingInt());
}
@ParallelSupported
public abstract EntryStream> groupByToEntry(final Function super T, ? extends K> classifier);
@ParallelSupported
public abstract EntryStream> groupByToEntry(final Function super T, ? extends K> classifier,
final Supplier extends Map>> mapFactory);
/**
*
* @param classifier
* @param valueMapper
* @return
* @see Collectors#toMultimap(Function, Function)
*/
@ParallelSupported
public abstract EntryStream> groupByToEntry(Function super T, ? extends K> classifier, Function super T, ? extends U> valueMapper);
/**
*
* @param classifier
* @param valueMapper
* @param mapFactory
* @return
* @see Collectors#toMultimap(Function, Function, Supplier)
*/
@ParallelSupported
public abstract EntryStream> groupByToEntry(Function super T, ? extends K> classifier, Function super T, ? extends U> valueMapper,
Supplier extends Map>> mapFactory);
@ParallelSupported
public abstract EntryStream groupByToEntry(final Function super T, ? extends K> classifier, final Collector super T, A, D> downstream);
@ParallelSupported
public abstract EntryStream groupByToEntry(final Function super T, ? extends K> classifier, final Collector super T, A, D> downstream,
final Supplier extends Map> mapFactory);
@ParallelSupported
public abstract EntryStream groupByToEntry(final Function super T, ? extends K> classifier,
final Function super T, ? extends U> valueMapper, final Collector super U, A, D> downstream);
@ParallelSupported
public abstract EntryStream groupByToEntry(final Function super T, ? extends K> classifier,
final Function super T, ? extends U> valueMapper, final Collector super U, A, D> downstream, final Supplier extends Map> mapFactory);
@ParallelSupported
public abstract EntryStream groupByToEntry(final Function super T, ? extends K> classifier,
final Function super T, ? extends U> valueMapper, BinaryOperator mergeFunction);
@ParallelSupported
public abstract EntryStream groupByToEntry(final Function super T, ? extends K> classifier,
final Function super T, ? extends V> valueMapper, final BinaryOperator mergeFunction, final Supplier extends Map> mapFactory);
/**
*
* @param predicate
* @return
* @see Collectors#partitioningBy(Predicate)
*/
@ParallelSupported
public abstract EntryStream> partitionByToEntry(final Predicate super T> predicate);
/**
*
* @param predicate
* @param downstream
* @return
* @see Collectors#partitioningBy(Predicate, Collector)
*/
@ParallelSupported
public abstract EntryStream partitionByToEntry(final Predicate super T> predicate, final Collector super T, A, D> downstream);
@ParallelSupported
public EntryStream countByToEntry(final Function super T, ? extends K> classifier) {
return groupByToEntry(classifier, Collectors.countingInt());
}
@SequentialOnly
public abstract Stream> collapse(final BiPredicate super T, ? super T> collapsible);
@SequentialOnly
public abstract > Stream collapse(final BiPredicate super T, ? super T> collapsible, Supplier supplier);
/**
* Merge series of adjacent elements which satisfy the given predicate using
* the merger function and return a new stream.
*
* Example:
*
*
* Stream.of(new Integer[0]).collapse((a, b) -> a < b, (a, b) -> a + b) => []
* Stream.of(1).collapse((a, b) -> a < b, (a, b) -> a + b) => [1]
* Stream.of(1, 2).collapse((a, b) -> a < b, (a, b) -> a + b) => [3]
* Stream.of(1, 2, 3).collapse((a, b) -> a < b, (a, b) -> a + b) => [6]
* Stream.of(1, 2, 3, 3, 2, 1).collapse((a, b) -> a < b, (a, b) -> a + b) => [6, 3, 2, 1]
*
*
*
*
* This method only run sequentially, even in parallel stream.
*
* @param collapsible
* @param mergeFunction
* @return
*/
@SequentialOnly
public abstract Stream collapse(final BiPredicate super T, ? super T> collapsible, final BiFunction super T, ? super T, T> mergeFunction);
@SequentialOnly
public abstract Stream collapse(final BiPredicate super T, ? super T> collapsible, final Supplier supplier,
final BiConsumer accumulator);
/**
* Merge series of adjacent elements which satisfy the given predicate using
* the merger function and return a new stream.
*
* Example:
*
*
* Stream.of(new Integer[0]).collapse((a, b) -> a < b, Collectors.summingInt(Fn.unboxI())) => []
* Stream.of(1).collapse((a, b) -> a < b, Collectors.summingInt(Fn.unboxI())) => [1]
* Stream.of(1, 2).collapse((a, b) -> a < b, Collectors.summingInt(Fn.unboxI())) => [3]
* Stream.of(1, 2, 3).collapse((a, b) -> a < b, Collectors.summingInt(Fn.unboxI())) => [6]
* Stream.of(1, 2, 3, 3, 2, 1).collapse((a, b) -> a < b, Collectors.summingInt(Fn.unboxI())) => [6, 3, 2, 1]
*
*
*
*
* This method only run sequentially, even in parallel stream.
*
* @param collapsible
* @param collector
* @return
*/
@SequentialOnly
public abstract Stream collapse(final BiPredicate super T, ? super T> collapsible, final Collector super T, A, R> collector);
/**
* Returns a {@code Stream} produced by iterative application of a accumulation function
* to an initial element {@code seed} and next element of the current stream.
* Produces a {@code Stream} consisting of {@code seed}, {@code acc(seed, value1)},
* {@code acc(acc(seed, value1), value2)}, etc.
*
* This is an intermediate operation.
*
*
Example:
*
*
* Stream.of(new Integer[0]).scan((a, b) -> a + b) => []
* Stream.of(1).scan((a, b) -> a + b) => [1]
* Stream.of(1, 2).scan((a, b) -> a + b) => [1, 3]
* Stream.of(1, 2, 3).scan((a, b) -> a + b) => [1, 3, 6]
* Stream.of(1, 2, 3, 3, 2, 1).scan((a, b) -> a + b) => [1, 3, 6, 9, 11, 12]
*
*
*
*
* This method only run sequentially, even in parallel stream.
*
* @param accumulator the accumulation function
* @return the new stream which has the extract same size as this stream.
*/
@SequentialOnly
public abstract Stream scan(final BiFunction super T, ? super T, T> accumulator);
/**
* Returns a {@code Stream} produced by iterative application of a accumulation function
* to an initial element {@code seed} and next element of the current stream.
* Produces a {@code Stream} consisting of {@code seed}, {@code acc(seed, value1)},
* {@code acc(acc(seed, value1), value2)}, etc.
*
* This is an intermediate operation.
*
*
Example:
*
*
* Stream.of(new Integer[0]).scan(10, (a, b) -> a + b) => []
* Stream.of(1).scan(10, (a, b) -> a + b) => [11]
* Stream.of(1, 2).scan(10, (a, b) -> a + b) => [11, 13]
* Stream.of(1, 2, 3).scan(10, (a, b) -> a + b) => [11, 13, 16]
* Stream.of(1, 2, 3, 3, 2, 1).scan(10, (a, b) -> a + b) => [11, 13, 16, 19, 21, 22]
*
*
*
*
* This method only run sequentially, even in parallel stream.
*
* @param seed 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.
*
* @param accumulator the accumulation function
* @return the new stream which has the extract same size as this stream.
*/
@SequentialOnly
public abstract Stream scan(final R seed, final BiFunction super R, ? super T, R> accumulator);
/**
*
* @param seed
* @param accumulator
* @param seedIncluded
* @return
*/
@SequentialOnly
public abstract Stream scan(final R seed, final BiFunction super R, ? super T, R> accumulator, final boolean seedIncluded);
/**
* Returns Stream of Stream with consecutive sub sequences of the elements, each of the same size (the final sequence may be smaller).
*
*
* This method only run sequentially, even in parallel stream.
*
* @param size
* @return
*/
@SequentialOnly
public abstract Stream> splitToSet(int size);
/**
* Returns Stream of Stream with consecutive sub sequences of the elements, each of the same size (the final sequence may be smaller).
*
*
* This method only run sequentially, even in parallel stream.
*
* @param size
* @param collectionSupplier
* @return
*/
@SequentialOnly
public abstract > Stream split(int size, IntFunction collectionSupplier);
@SequentialOnly
public abstract Stream split(int size, Collector super T, A, R> collector);
@SequentialOnly
public abstract Stream> splitToSet(Predicate super T> predicate);
@SequentialOnly
public abstract > Stream split(Predicate super T> predicate, Supplier collectionSupplier);
@SequentialOnly
public abstract Stream split(Predicate super T> predicate, Collector super T, A, R> collector);
@SequentialOnly
public abstract Stream splitAt(int where, Collector super T, A, R> collector);
@SequentialOnly
public abstract Stream splitBy(Predicate super T> where, Collector super T, A, R> collector);
@SequentialOnly
public abstract > Stream sliding(int windowSize, IntFunction collectionSupplier);
@SequentialOnly
public abstract > Stream sliding(int windowSize, int increment, IntFunction collectionSupplier);
@SequentialOnly
public abstract Stream sliding(int windowSize, Collector super T, A, R> collector);
@SequentialOnly
public abstract Stream sliding(int windowSize, int increment, Collector super T, A, R> collector);
/**
* Split this stream by the specified duration.
*
* @param duration
* @return
* @see Fn#window(Duration, LongSupplier)
*/
@SequentialOnly
public abstract Stream> window(Duration duration);
/**
*
* @param duration
* @param startTime
* @return
* @see #window(Duration)
* @see Fn#window(Duration, LongSupplier)
* @see #sliding(int, int, Collector)
*/
@SequentialOnly
public abstract Stream> window(Duration duration, LongSupplier startTime);
/**
*
* @param duration
* @return
* @see #window(Duration)
* @see Fn#window(Duration, LongSupplier)
* @see #sliding(int, int, Collector)
*/
@SequentialOnly
public abstract Stream> windowToList(Duration duration);
/**
*
* @param duration
* @return
* @see #window(Duration)
* @see Fn#window(Duration, LongSupplier)
* @see #sliding(int, int, Collector)
*/
@SequentialOnly
public abstract Stream> windowToSet(Duration duration);
/**
*
* @param duration
* @param collectionSupplier
* @return
* @see #window(Duration)
* @see Fn#window(Duration, LongSupplier)
* @see #sliding(int, int, Collector)
*/
@SequentialOnly
public abstract > Stream window(Duration duration, Supplier collectionSupplier);
/**
*
* @param duration
* @param startTime
* @param collectionSupplier
* @return
* @see #window(Duration)
* @see Fn#window(Duration, LongSupplier)
* @see #sliding(int, int, Collector)
*/
@SequentialOnly
public abstract > Stream window(Duration duration, LongSupplier startTime, Supplier collectionSupplier);
/**
*
* @param duration
* @param collector
* @return
* @see #window(Duration)
* @see Fn#window(Duration, LongSupplier)
* @see #sliding(int, int, Collector)
*/
@SequentialOnly
public abstract Stream window(Duration duration, Collector super T, A, R> collector);
/**
*
* @param duration
* @param startTime
* @param collector
* @return
* @see #window(Duration)
* @see Fn#window(Duration, LongSupplier)
* @see #sliding(int, int, Collector)
*/
@SequentialOnly
public abstract Stream window(Duration duration, LongSupplier startTime, Collector super T, A, R> collector);
/**
*
* @param duration
* @param incrementInMillis
* @return
* @see #window(Duration)
* @see Fn#window(Duration, LongSupplier)
* @see #sliding(int, int, Collector)
*/
@SequentialOnly
public abstract Stream> window(Duration duration, long incrementInMillis);
/**
*
* @param duration
* @param incrementInMillis
* @param startTime
* @return
* @see #window(Duration)
* @see Fn#window(Duration, LongSupplier)
* @see #sliding(int, int, Collector)
*/
@SequentialOnly
public abstract Stream> window(Duration duration, long incrementInMillis, LongSupplier startTime);
/**
*
* @param duration
* @param incrementInMillis
* @return
* @see #window(Duration)
* @see Fn#window(Duration, LongSupplier)
* @see #sliding(int, int, Collector)
*/
@SequentialOnly
public abstract Stream> windowToList(Duration duration, long incrementInMillis);
/**
*
* @param duration
* @param incrementInMillis
* @return
* @see #window(Duration)
* @see Fn#window(Duration, LongSupplier)
* @see #sliding(int, int, Collector)
*/
@SequentialOnly
public abstract Stream> windowToSet(Duration duration, long incrementInMillis);
/**
*
* @param duration
* @param incrementInMillis
* @param collectionSupplier
* @return
* @see #window(Duration)
* @see Fn#window(Duration, LongSupplier)
* @see #sliding(int, int, Collector)
*/
@SequentialOnly
public abstract > Stream window(Duration duration, long incrementInMillis, Supplier collectionSupplier);
/**
*
* @param duration
* @param incrementInMillis
* @param startTime
* @param collectionSupplier
* @return
* @see #window(Duration)
* @see Fn#window(Duration, LongSupplier)
* @see #sliding(int, int, Collector)
*/
@SequentialOnly
public abstract > Stream window(Duration duration, long incrementInMillis, LongSupplier startTime,
Supplier collectionSupplier);
/**
*
* @param duration
* @param incrementInMillis
* @param collector
* @return
* @see #window(Duration)
* @see Fn#window(Duration, LongSupplier)
* @see #sliding(int, int, Collector)
*/
@SequentialOnly
public abstract Stream window(Duration duration, long incrementInMillis, Collector super T, A, R> collector);
/**
*
* @param duration
* @param incrementInMillis
* @param startTime
* @param collector
* @return
* @see #window(Duration)
* @see Fn#window(Duration, LongSupplier)
* @see #sliding(int, int, Collector)
*/
@SequentialOnly
public abstract Stream window(Duration duration, long incrementInMillis, LongSupplier startTime, Collector super T, A, R> collector);
/**
* Stream.of(1).intersperse(9) --> [1]
* Stream.of(1, 2, 3).intersperse(9) --> [1, 9, 2, 9, 3]
*
*
* This method only run sequentially, even in parallel stream.
*
* @param delimiter
* @return
*/
@SequentialOnly
public abstract Stream intersperse(T delimiter);
/**
* Distinct and filter by occurrences.
*
* @param occurrencesFilter
* @return
*/
@ParallelSupported
public Stream distinct(final Predicate super Long> occurrencesFilter) {
final Supplier extends Map> supplier = isParallel() ? Suppliers. ofConcurrentHashMap() : Suppliers. ofLinkedHashMap();
return groupBy(Fn. identity(), Collectors.counting(), supplier).filter(Fn. testByValue(occurrencesFilter)).map(Fn. key());
}
/**
* Distinct by the value mapped from keyExtractor
*
* @param keyExtractor don't change value of the input parameter.
* @return
*/
@ParallelSupported
public abstract Stream distinctBy(Function super T, ?> keyExtractor);
/**
* Distinct and filter by occurrences.
*
* @param keyExtractor
* @param occurrencesFilter
* @return
*/
public Stream distinctBy(final Function super T, K> keyExtractor, final Predicate super Long> occurrencesFilter) {
final Supplier extends Map, Long>> supplier = isParallel() ? Suppliers., Long> ofConcurrentHashMap()
: Suppliers., Long> ofLinkedHashMap();
return groupBy(Fn. keyed(keyExtractor), Collectors.counting(), supplier).filter(Fn., Long> testByValue(occurrencesFilter))
.map(Fn. kk());
}
/**
*
*
* This method only run sequentially, even in parallel stream.
*
* @param n
* @return
*/
@SequentialOnly
public abstract Stream top(int n);
/**
*
* This method only run sequentially, even in parallel stream.
*
* @param n
* @param comparator
* @return
*/
@SequentialOnly
public abstract Stream top(int n, Comparator super T> comparator);
@ParallelSupported
public abstract Stream sorted(Comparator super T> comparator);
@SuppressWarnings("rawtypes")
@ParallelSupported
public abstract Stream sortedBy(Function super T, ? extends Comparable> keyExtractor);
@ParallelSupported
public abstract Stream sortedByInt(ToIntFunction super T> keyExtractor);
@ParallelSupported
public abstract Stream sortedByLong(ToLongFunction super T> keyExtractor);
@ParallelSupported
public abstract Stream sortedByDouble(ToDoubleFunction super T> keyExtractor);
@ParallelSupported
public abstract void forEach(Try.Consumer super T, E> action) throws E;
@ParallelSupported
public abstract void forEachPair(final Try.BiConsumer super T, ? super T, E> action) throws E;
/**
* Slide with windowSize = 2
and the specified increment
, then consume
by the specified mapper
.
*
* @param mapper
* @param increment
* @return
*/
@ParallelSupported
public abstract void forEachPair(final Try.BiConsumer super T, ? super T, E> action, final int increment) throws E;
@ParallelSupported
public abstract void forEachTriple(final Try.TriConsumer super T, ? super T, ? super T, E> action) throws E;
/**
* Slide with windowSize = 3
and the specified increment
, then consume
by the specified mapper
.
*
* @param mapper
* @param increment
* @return
*/
@ParallelSupported
public abstract void forEachTriple(final Try.TriConsumer super T, ? super T, ? super T, E> action, final int increment) throws E;
@ParallelSupported
public abstract boolean anyMatch(Try.Predicate super T, E> predicate) throws E;
@ParallelSupported
public abstract boolean allMatch(Try.Predicate super T, E> predicate) throws E;
@ParallelSupported
public abstract boolean noneMatch(Try.Predicate super T, E> predicate) throws E;
@ParallelSupported
public abstract Optional findFirst(Try.Predicate super T, E> predicate) throws E;
@ParallelSupported
public abstract Optional findLast(Try.Predicate super T, E> predicate) throws E;
@SequentialOnly
public abstract Optional findFirstOrLast(Try.Predicate super T, E> predicateForFirst,
Try.Predicate super T, E2> predicateForLast) throws E, E2;
/**
*
* This method only run sequentially, even in parallel stream.
*
* @param seed
* @param predicateForFirst
* @param predicateForLast
* @return
*/
@SequentialOnly
public abstract Optional findFirstOrLast(final U seed,
final Try.BiPredicate super T, ? super U, E> predicateForFirst, final Try.BiPredicate super T, ? super U, E2> predicateForLast) throws E, E2;
/**
*
* This method only run sequentially, even in parallel stream.
*
* @param preFunc
* @param predicateForFirst
* @param predicateForLast
* @return
*/
@SequentialOnly
public abstract Optional findFirstOrLast(final Function super T, U> preFunc,
final Try.BiPredicate super T, ? super U, E> predicateForFirst, final Try.BiPredicate super T, ? super U, E2> predicateForLast) throws E, E2;
@ParallelSupported
public abstract Optional findAny(Try.Predicate super T, E> predicate) throws E;
@SequentialOnly
public abstract boolean containsAll(T... a);
@SequentialOnly
public abstract boolean containsAll(Collection extends T> c);
@SequentialOnly
public abstract A[] toArray(IntFunction generator);
/**
*
* @param keyExtractor
* @param valueMapper
* @return
* @see Collectors#toMap(Function, Function)
*/
@ParallelSupported
public ImmutableMap