public abstract class FloatStream extends Object
BaseStream
,
Stream
Modifier and Type | Class and Description |
---|---|
static class |
FloatStream.FloatStreamEx |
BaseStream.Splitor
Modifier and Type | Method and Description |
---|---|
<SS extends BaseStream> |
__(Function<? super FloatStream,SS> transfer) |
abstract <E extends Exception> |
allMatch(Throwables.FloatPredicate<E> predicate) |
abstract <E extends Exception> |
anyMatch(Throwables.FloatPredicate<E> predicate) |
abstract FloatStream |
append(float... a) |
abstract FloatStream |
appendIfEmpty(float... a) |
abstract DoubleStream |
asDoubleStream() |
abstract u.OptionalDouble |
average() |
abstract Stream<Float> |
boxed() |
S |
carry(C action)
Same as
peek |
void |
close() |
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.
|
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.
|
abstract <R> R |
collect(Supplier<R> supplier,
ObjFloatConsumer<? super R> accumulator) |
abstract <R> R |
collect(Supplier<R> supplier,
ObjFloatConsumer<? super R> accumulator,
BiConsumer<R,R> combiner) |
static FloatStream |
concat(Collection<? extends FloatStream> c) |
static FloatStream |
concat(float[]... a) |
static FloatStream |
concat(FloatIterator... a) |
static FloatStream |
concat(FloatStream... a) |
static FloatStream |
empty() |
abstract <E extends Exception> |
findAny(Throwables.FloatPredicate<E> predicate) |
abstract <E extends Exception> |
findFirst(Throwables.FloatPredicate<E> predicate) |
abstract <E extends Exception,E2 extends Exception> |
findFirstOrLast(Throwables.FloatPredicate<E> predicateForFirst,
Throwables.FloatPredicate<E> predicateForLast) |
abstract <E extends Exception> |
findLast(Throwables.FloatPredicate<E> predicate)
Consider using:
stream.reversed().findFirst(predicate) for better performance if possible. |
abstract FloatStream |
flatMap(FloatFunction<? extends FloatStream> mapper) |
abstract <T> Stream<T> |
flatMappToObj(FloatFunction<T[]> mapper) |
abstract DoubleStream |
flatMapToDouble(FloatFunction<? extends DoubleStream> mapper) |
abstract IntStream |
flatMapToInt(FloatFunction<? extends IntStream> mapper) |
abstract LongStream |
flatMapToLong(FloatFunction<? extends LongStream> mapper) |
abstract <T> Stream<T> |
flatMapToObj(FloatFunction<? extends Stream<T>> mapper) |
static FloatStream |
flatten(float[][] a) |
static FloatStream |
flatten(float[][][] a) |
static FloatStream |
flatten(float[][] a,
boolean vertically) |
static FloatStream |
flatten(float[][] a,
float valueForNone,
boolean vertically) |
abstract FloatStream |
flattMap(FloatFunction<float[]> mapper) |
abstract <T> Stream<T> |
flattMapToObj(FloatFunction<? extends Collection<T>> mapper) |
abstract <E extends Exception> |
forEach(Throwables.FloatConsumer<E> action) |
abstract <E extends Exception> |
forEachIndexed(Throwables.IndexedFloatConsumer<E> action) |
static FloatStream |
generate(FloatSupplier s) |
boolean |
isParallel() |
static FloatStream |
iterate(BooleanSupplier hasNext,
FloatSupplier next) |
static FloatStream |
iterate(float init,
BooleanSupplier hasNext,
FloatUnaryOperator f) |
static FloatStream |
iterate(float init,
FloatPredicate hasNext,
FloatUnaryOperator f) |
static FloatStream |
iterate(float init,
FloatUnaryOperator f) |
FloatIterator |
iterator()
Remember to close this Stream after the iteration is done, if needed.
|
String |
join(CharSequence delimiter) |
abstract u.OptionalFloat |
kthLargest(int k) |
abstract FloatStream |
map(FloatUnaryOperator mapper) |
abstract DoubleStream |
mapToDouble(FloatToDoubleFunction mapper) |
abstract IntStream |
mapToInt(FloatToIntFunction mapper) |
abstract LongStream |
mapToLong(FloatToLongFunction mapper) |
abstract <U> Stream<U> |
mapToObj(FloatFunction<? extends U> mapper) |
abstract u.OptionalFloat |
max() |
static FloatStream |
merge(Collection<? extends FloatStream> c,
FloatBiFunction<MergeResult> nextSelector) |
static FloatStream |
merge(float[] a,
float[] b,
float[] c,
FloatBiFunction<MergeResult> nextSelector) |
static FloatStream |
merge(float[] a,
float[] b,
FloatBiFunction<MergeResult> nextSelector) |
static FloatStream |
merge(FloatIterator a,
FloatIterator b,
FloatBiFunction<MergeResult> nextSelector) |
static FloatStream |
merge(FloatIterator a,
FloatIterator b,
FloatIterator c,
FloatBiFunction<MergeResult> nextSelector) |
abstract FloatStream |
merge(FloatStream b,
FloatBiFunction<MergeResult> nextSelector) |
static FloatStream |
merge(FloatStream a,
FloatStream b,
FloatBiFunction<MergeResult> nextSelector) |
static FloatStream |
merge(FloatStream a,
FloatStream b,
FloatStream c,
FloatBiFunction<MergeResult> nextSelector) |
abstract u.OptionalFloat |
min() |
abstract <E extends Exception> |
noneMatch(Throwables.FloatPredicate<E> predicate) |
static FloatStream |
of(Collection<Float> c) |
static FloatStream |
of(float... a) |
static FloatStream |
of(Float[] a) |
static FloatStream |
of(float[] a,
int startIndex,
int endIndex) |
static FloatStream |
of(Float[] a,
int startIndex,
int endIndex) |
static FloatStream |
of(FloatIterator iterator) |
static FloatStream |
of(Supplier<FloatList> supplier)
Lazy evaluation.
|
S |
parallel() |
S |
parallel(BaseStream.Splitor splitor) |
S |
parallel(Executor executor) |
S |
parallel(int maxThreadNum) |
S |
parallel(int maxThreadNum,
BaseStream.Splitor splitor)
Returns an equivalent stream that is parallel.
|
S |
parallel(int maxThreadNum,
BaseStream.Splitor splitor,
Executor executor) |
S |
parallel(int maxThreadNum,
Executor executor) |
static FloatStream |
parallelMerge(Collection<? extends FloatStream> c,
FloatBiFunction<MergeResult> nextSelector) |
static FloatStream |
parallelMerge(Collection<? extends FloatStream> c,
FloatBiFunction<MergeResult> nextSelector,
int maxThreadNum) |
abstract FloatStream |
prepend(float... a) |
void |
println() |
static FloatStream |
random() |
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. |
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. |
abstract u.OptionalFloat |
reduce(FloatBinaryOperator op) |
abstract float |
reduce(float identity,
FloatBinaryOperator op) |
static FloatStream |
repeat(float element,
long n) |
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. |
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. |
abstract FloatStream |
scan(float init,
FloatBinaryOperator accumulator,
boolean initIncluded) |
S |
sequential() |
S |
shuffled()
This method only run sequentially, even in parallel stream and all elements will be loaded to memory. |
FloatStream |
skipUntil(FloatPredicate predicate) |
Stream<S> |
sliding(int windowSize) |
Stream<PL> |
slidingToList(int windowSize) |
abstract double |
sum() |
abstract FloatSummaryStatistics |
summarize() |
abstract Pair<FloatSummaryStatistics,u.Optional<Map<Percentage,Float>>> |
summarizeAndPercentiles() |
abstract FloatList |
toFloatList() |
ImmutableList<T> |
toImmutableList() |
ImmutableSet<T> |
toImmutableSet() |
abstract <K,A,D> Map<K,D> |
toMap(FloatFunction<? extends K> keyMapper,
Collector<Float,A,D> downstream) |
abstract <K,A,D,M extends Map<K,D>> |
toMap(FloatFunction<? extends K> keyMapper,
Collector<Float,A,D> downstream,
Supplier<? extends M> mapFactory) |
abstract <K,V> Map<K,V> |
toMap(FloatFunction<? extends K> keyMapper,
FloatFunction<? extends V> valueMapper) |
abstract <K,V> Map<K,V> |
toMap(FloatFunction<? extends K> keyMapper,
FloatFunction<? extends V> valueMapper,
BinaryOperator<V> mergeFunction) |
abstract <K,V,M extends Map<K,V>> |
toMap(FloatFunction<? extends K> keyMapper,
FloatFunction<? extends V> valueMapper,
BinaryOperator<V> mergeFunction,
Supplier<? extends M> mapFactory) |
abstract <K,V,M extends Map<K,V>> |
toMap(FloatFunction<? extends K> keyMapper,
FloatFunction<? extends V> valueMapper,
Supplier<? extends M> mapFactory) |
abstract FloatStream |
top(int n)
This method only run sequentially, even in parallel stream. |
abstract FloatStream |
top(int n,
Comparator<? super Float> comparator)
This method only run sequentially, even in parallel stream. |
static FloatStream |
zip(Collection<? extends FloatStream> c,
float[] valuesForNone,
FloatNFunction<Float> zipFunction)
Zip together the iterators until all of them runs out of values.
|
static FloatStream |
zip(Collection<? extends FloatStream> c,
FloatNFunction<Float> zipFunction)
Zip together the iterators until one of them runs out of values.
|
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.
|
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.
|
static FloatStream |
zip(float[] a,
float[] b,
FloatBinaryOperator zipFunction)
Zip together the "a" and "b" arrays until one of them runs out of values.
|
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.
|
static FloatStream |
zip(FloatIterator a,
FloatIterator b,
FloatBinaryOperator zipFunction)
Zip together the "a" and "b" iterators until one of them runs out of values.
|
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.
|
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.
|
static FloatStream |
zip(FloatIterator a,
FloatIterator b,
FloatIterator c,
FloatTernaryOperator zipFunction)
Zip together the "a", "b" and "c" iterators until one of them runs out of values.
|
static FloatStream |
zip(FloatStream a,
FloatStream b,
FloatBinaryOperator zipFunction)
Zip together the "a" and "b" streams until one of them runs out of values.
|
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.
|
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.
|
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.
|
abstract FloatStream |
zipWith(FloatStream b,
FloatBinaryOperator zipFunction) |
abstract FloatStream |
zipWith(FloatStream b,
float valueForNoneA,
float valueForNoneB,
FloatBinaryOperator zipFunction) |
abstract FloatStream |
zipWith(FloatStream b,
FloatStream c,
float valueForNoneA,
float valueForNoneB,
float valueForNoneC,
FloatTernaryOperator zipFunction) |
abstract FloatStream |
zipWith(FloatStream b,
FloatStream c,
FloatTernaryOperator zipFunction) |
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
acceptIfNotEmpty, append, appendIfEmpty, applyIfNotEmpty, count, difference, distinct, dropWhile, dropWhile, filter, filter, first, indexed, intersection, join, last, limit, onClose, onlyOne, peek, percentiles, prepend, removeIf, removeIf, reversed, reverseSorted, rotated, shuffled, skip, skip, sliding, slidingToList, sorted, split, split, splitAt, splitBy, splitToList, splitToList, step, symmetricDifference, takeWhile, toArray, toCollection, toList, toLongMultiset, toLongMultiset, toMultiset, toMultiset, toSet
@ParallelSupported @IntermediateOp @Beta public FloatStream skipUntil(FloatPredicate predicate)
public abstract FloatStream map(FloatUnaryOperator mapper)
public abstract IntStream mapToInt(FloatToIntFunction mapper)
public abstract LongStream mapToLong(FloatToLongFunction mapper)
public abstract DoubleStream mapToDouble(FloatToDoubleFunction mapper)
public abstract <U> Stream<U> mapToObj(FloatFunction<? extends U> mapper)
public abstract FloatStream flatMap(FloatFunction<? extends FloatStream> mapper)
public abstract FloatStream flattMap(FloatFunction<float[]> mapper)
public abstract IntStream flatMapToInt(FloatFunction<? extends IntStream> mapper)
public abstract LongStream flatMapToLong(FloatFunction<? extends LongStream> mapper)
public abstract DoubleStream flatMapToDouble(FloatFunction<? extends DoubleStream> mapper)
public abstract <T> Stream<T> flatMapToObj(FloatFunction<? extends Stream<T>> mapper)
public abstract <T> Stream<T> flattMapToObj(FloatFunction<? extends Collection<T>> mapper)
public abstract <T> Stream<T> flatMappToObj(FloatFunction<T[]> mapper)
@SequentialOnly public abstract FloatStream rangeMap(FloatBiPredicate sameRange, FloatBinaryOperator mapper)
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.collapse(FloatBiPredicate, FloatBinaryOperator)
,
Stream.rangeMap(BiPredicate, BiFunction)
@SequentialOnly public abstract <T> Stream<T> rangeMapToObj(FloatBiPredicate sameRange, FloatBiFunction<T> mapper)
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.Stream.rangeMap(BiPredicate, BiFunction)
@SequentialOnly public abstract Stream<FloatList> collapse(FloatBiPredicate collapsible)
collapsible
- @SequentialOnly public abstract FloatStream collapse(FloatBiPredicate collapsible, FloatBinaryOperator mergeFunction)
collapsible
- mergeFunction
- @SequentialOnly public abstract FloatStream scan(FloatBinaryOperator accumulator)
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]
accumulator
- the accumulation function@SequentialOnly public abstract FloatStream scan(float init, FloatBinaryOperator accumulator)
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]
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@SequentialOnly public abstract FloatStream scan(float init, FloatBinaryOperator accumulator, boolean initIncluded)
init
- accumulator
- initIncluded
- public abstract FloatStream prepend(float... a)
public abstract FloatStream append(float... a)
public abstract FloatStream appendIfEmpty(float... a)
@SequentialOnly public abstract FloatStream top(int n)
n
- @SequentialOnly public abstract FloatStream top(int n, Comparator<? super Float> comparator)
n
- public abstract FloatList toFloatList()
public abstract <K,V> Map<K,V> toMap(FloatFunction<? extends K> keyMapper, FloatFunction<? extends V> valueMapper)
keyMapper
- valueMapper
- Collectors.toMap(Function, Function)
public abstract <K,V,M extends Map<K,V>> M toMap(FloatFunction<? extends K> keyMapper, FloatFunction<? extends V> valueMapper, Supplier<? extends M> mapFactory)
keyMapper
- valueMapper
- mapFactory
- Collectors.toMap(Function, Function, Supplier)
public abstract <K,V> Map<K,V> toMap(FloatFunction<? extends K> keyMapper, FloatFunction<? extends V> valueMapper, BinaryOperator<V> mergeFunction)
keyMapper
- valueMapper
- mergeFunction
- Collectors.toMap(Function, Function, BinaryOperator)
public abstract <K,V,M extends Map<K,V>> M toMap(FloatFunction<? extends K> keyMapper, FloatFunction<? extends V> valueMapper, BinaryOperator<V> mergeFunction, Supplier<? extends M> mapFactory)
keyMapper
- valueMapper
- mergeFunction
- mapFactory
- Collectors.toMap(Function, Function, BinaryOperator, Supplier)
public abstract <K,A,D> Map<K,D> toMap(FloatFunction<? extends K> keyMapper, Collector<Float,A,D> downstream)
keyMapper
- downstream
- Collectors.groupingBy(Function, Collector)
public abstract <K,A,D,M extends Map<K,D>> M toMap(FloatFunction<? extends K> keyMapper, Collector<Float,A,D> downstream, Supplier<? extends M> mapFactory)
keyMapper
- downstream
- mapFactory
- Collectors.groupingBy(Function, Collector, Supplier)
public abstract float reduce(float identity, FloatBinaryOperator op)
public abstract u.OptionalFloat reduce(FloatBinaryOperator op)
public abstract <R> R collect(Supplier<R> supplier, ObjFloatConsumer<? super R> accumulator, BiConsumer<R,R> combiner)
public abstract <R> R collect(Supplier<R> supplier, ObjFloatConsumer<? super R> accumulator)
@ParallelSupported @TerminalOp public abstract <E extends Exception> void forEach(Throwables.FloatConsumer<E> action) throws E extends Exception
E extends Exception
@ParallelSupported @TerminalOp public abstract <E extends Exception> void forEachIndexed(Throwables.IndexedFloatConsumer<E> action) throws E extends Exception
E extends Exception
public abstract <E extends Exception> boolean anyMatch(Throwables.FloatPredicate<E> predicate) throws E extends Exception
E extends Exception
public abstract <E extends Exception> boolean allMatch(Throwables.FloatPredicate<E> predicate) throws E extends Exception
E extends Exception
public abstract <E extends Exception> boolean noneMatch(Throwables.FloatPredicate<E> predicate) throws E extends Exception
E extends Exception
public abstract <E extends Exception> u.OptionalFloat findFirst(Throwables.FloatPredicate<E> predicate) throws E extends Exception
E extends Exception
public abstract <E extends Exception> u.OptionalFloat findLast(Throwables.FloatPredicate<E> predicate) throws E extends Exception
stream.reversed().findFirst(predicate)
for better performance if possible.E
- predicate
- E
E extends Exception
public abstract <E extends Exception,E2 extends Exception> u.OptionalFloat findFirstOrLast(Throwables.FloatPredicate<E> predicateForFirst, Throwables.FloatPredicate<E> predicateForLast) throws E extends Exception, E2 extends Exception
E extends Exception
public abstract <E extends Exception> u.OptionalFloat findAny(Throwables.FloatPredicate<E> predicate) throws E extends Exception
E extends Exception
public abstract u.OptionalFloat min()
public abstract u.OptionalFloat max()
public abstract u.OptionalFloat kthLargest(int k)
k
- public abstract double sum()
public abstract u.OptionalDouble average()
public abstract FloatSummaryStatistics summarize()
public abstract Pair<FloatSummaryStatistics,u.Optional<Map<Percentage,Float>>> summarizeAndPercentiles()
public abstract FloatStream merge(FloatStream b, FloatBiFunction<MergeResult> nextSelector)
b
- nextSelector
- first parameter is selected if Nth.FIRST
is returned, otherwise the second parameter is selected.public abstract FloatStream zipWith(FloatStream b, FloatBinaryOperator zipFunction)
public abstract FloatStream zipWith(FloatStream b, FloatStream c, FloatTernaryOperator zipFunction)
public abstract FloatStream zipWith(FloatStream b, float valueForNoneA, float valueForNoneB, FloatBinaryOperator zipFunction)
public abstract FloatStream zipWith(FloatStream b, FloatStream c, float valueForNoneA, float valueForNoneB, float valueForNoneC, FloatTernaryOperator zipFunction)
public abstract DoubleStream asDoubleStream()
@SequentialOnly public FloatIterator iterator()
@SequentialOnly @IntermediateOp @Beta public <SS extends BaseStream> SS __(Function<? super FloatStream,SS> transfer)
public static FloatStream empty()
@SafeVarargs public static FloatStream of(float... a)
public static FloatStream of(float[] a, int startIndex, int endIndex)
public static FloatStream of(Float[] a)
public static FloatStream of(Float[] a, int startIndex, int endIndex)
public static FloatStream of(Collection<Float> c)
public static FloatStream of(FloatIterator iterator)
public static FloatStream of(Supplier<FloatList> supplier)
supplier
- public static FloatStream flatten(float[][] a)
public static FloatStream flatten(float[][] a, boolean vertically)
public static FloatStream flatten(float[][] a, float valueForNone, boolean vertically)
public static FloatStream flatten(float[][][] a)
public static FloatStream repeat(float element, long n)
public static FloatStream random()
public static FloatStream iterate(BooleanSupplier hasNext, FloatSupplier next)
public static FloatStream iterate(float init, BooleanSupplier hasNext, FloatUnaryOperator f)
public static FloatStream iterate(float init, FloatPredicate hasNext, FloatUnaryOperator f)
init
- hasNext
- test if has next by hasNext.test(init) for first time and hasNext.test(f.apply(previous)) for remaining.f
- public static FloatStream iterate(float init, FloatUnaryOperator f)
public static FloatStream generate(FloatSupplier s)
@SafeVarargs public static FloatStream concat(float[]... a)
@SafeVarargs public static FloatStream concat(FloatIterator... a)
@SafeVarargs public static FloatStream concat(FloatStream... a)
public static FloatStream concat(Collection<? extends FloatStream> c)
public static FloatStream zip(float[] a, float[] b, FloatBinaryOperator zipFunction)
a
- b
- public static FloatStream zip(float[] a, float[] b, float[] c, FloatTernaryOperator zipFunction)
a
- b
- c
- public static FloatStream zip(FloatIterator a, FloatIterator b, FloatBinaryOperator zipFunction)
a
- b
- public static FloatStream zip(FloatIterator a, FloatIterator b, FloatIterator c, FloatTernaryOperator zipFunction)
a
- b
- public static FloatStream zip(FloatStream a, FloatStream b, FloatBinaryOperator zipFunction)
a
- b
- public static FloatStream zip(FloatStream a, FloatStream b, FloatStream c, FloatTernaryOperator zipFunction)
a
- b
- public static FloatStream zip(Collection<? extends FloatStream> c, FloatNFunction<Float> zipFunction)
c
- zipFunction
- public static FloatStream zip(float[] a, float[] b, float valueForNoneA, float valueForNoneB, FloatBinaryOperator zipFunction)
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
- public static FloatStream zip(float[] a, float[] b, float[] c, float valueForNoneA, float valueForNoneB, float valueForNoneC, FloatTernaryOperator zipFunction)
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
- public static FloatStream zip(FloatIterator a, FloatIterator b, float valueForNoneA, float valueForNoneB, FloatBinaryOperator zipFunction)
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
- public static FloatStream zip(FloatIterator a, FloatIterator b, FloatIterator c, float valueForNoneA, float valueForNoneB, float valueForNoneC, FloatTernaryOperator zipFunction)
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
- public static FloatStream zip(FloatStream a, FloatStream b, float valueForNoneA, float valueForNoneB, FloatBinaryOperator zipFunction)
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
- public static FloatStream zip(FloatStream a, FloatStream b, FloatStream c, float valueForNoneA, float valueForNoneB, float valueForNoneC, FloatTernaryOperator zipFunction)
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
- public static FloatStream zip(Collection<? extends FloatStream> c, float[] valuesForNone, FloatNFunction<Float> zipFunction)
c
- valuesForNone
- value to fill for any iterator runs out of values.zipFunction
- public static FloatStream merge(float[] a, float[] b, FloatBiFunction<MergeResult> nextSelector)
a
- b
- nextSelector
- first parameter is selected if Nth.FIRST
is returned, otherwise the second parameter is selected.public static FloatStream merge(float[] a, float[] b, float[] c, FloatBiFunction<MergeResult> nextSelector)
a
- b
- c
- nextSelector
- first parameter is selected if Nth.FIRST
is returned, otherwise the second parameter is selected.public static FloatStream merge(FloatIterator a, FloatIterator b, FloatBiFunction<MergeResult> nextSelector)
a
- b
- nextSelector
- first parameter is selected if Nth.FIRST
is returned, otherwise the second parameter is selected.public static FloatStream merge(FloatIterator a, FloatIterator b, FloatIterator c, FloatBiFunction<MergeResult> nextSelector)
a
- b
- c
- nextSelector
- first parameter is selected if Nth.FIRST
is returned, otherwise the second parameter is selected.public static FloatStream merge(FloatStream a, FloatStream b, FloatBiFunction<MergeResult> nextSelector)
a
- b
- nextSelector
- first parameter is selected if Nth.FIRST
is returned, otherwise the second parameter is selected.public static FloatStream merge(FloatStream a, FloatStream b, FloatStream c, FloatBiFunction<MergeResult> nextSelector)
a
- b
- c
- nextSelector
- first parameter is selected if Nth.FIRST
is returned, otherwise the second parameter is selected.public static FloatStream merge(Collection<? extends FloatStream> c, FloatBiFunction<MergeResult> nextSelector)
c
- nextSelector
- first parameter is selected if Nth.FIRST
is returned, otherwise the second parameter is selected.public static FloatStream parallelMerge(Collection<? extends FloatStream> c, FloatBiFunction<MergeResult> nextSelector)
c
- nextSelector
- first parameter is selected if Nth.FIRST
is returned, otherwise the second parameter is selected.public static FloatStream parallelMerge(Collection<? extends FloatStream> c, FloatBiFunction<MergeResult> nextSelector, int maxThreadNum)
c
- nextSelector
- first parameter is selected if Nth.FIRST
is returned, otherwise the second parameter is selected.maxThreadNum
- public S carry(C action)
BaseStream
peek
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>>
BaseStream.peek(Object)
public Stream<S> sliding(int windowSize)
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>>
BaseStream.sliding(int, int)
public Stream<PL> slidingToList(int windowSize)
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>>
BaseStream.sliding(int, int)
public S shuffled()
BaseStream
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>>
public ImmutableList<T> toImmutableList()
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>>
public ImmutableSet<T> toImmutableSet()
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>>
public String join(CharSequence delimiter)
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>>
public void println()
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>>
public boolean isParallel()
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>>
public S sequential()
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>>
public S parallel()
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>>
public S parallel(int maxThreadNum)
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>>
public S parallel(BaseStream.Splitor splitor)
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>>
public S parallel(int maxThreadNum, BaseStream.Splitor splitor)
BaseStream
maxThreadNum
and splitor
as the specified ones.
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 = 10 | m = 50 | m = 100 | m = 500 | m = 1000 | |
---|---|---|---|---|---|---|
Q | 0.00002 | 0.0002 | 0.001 | 0.002 | 0.01 | 0.02 |
For Loop | 0.23 | 2.3 | 11 | 22 | 110 | 219 |
JDK Sequential | 0.28 | 2.3 | 11 | 22 | 114 | 212 |
JDK Parallel | 0.22 | 1.3 | 6 | 12 | 66 | 122 |
Abcus Sequential | 0.3 | 2 | 11 | 22 | 112 | 212 |
Abcus Parallel | 11 | 11 | 11 | 16 | 77 | 128 |
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.
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>>
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
.MergeResult
,
com.landawn.abacus.util.Profiler#run(int, int, int, String, Runnable)
,
Understanding Parallel Stream Performance in Java SE 8,
When to use parallel Streamspublic S parallel(int maxThreadNum, BaseStream.Splitor splitor, Executor executor)
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.public S parallel(int maxThreadNum, Executor executor)
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.public S parallel(Executor executor)
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.public void close()
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>>
close
in interface AutoCloseable
Copyright © 2020. All rights reserved.