Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
com.landawn.abacus.util.stream.AbstractFloatStream Maven / Gradle / Ivy
Go to download
A general programming library in Java/Android. It's easy to learn and simple to use with concise and powerful APIs.
/*
* 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.util.Collection;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import com.landawn.abacus.exception.DuplicatedResultException;
import com.landawn.abacus.util.FloatIterator;
import com.landawn.abacus.util.FloatList;
import com.landawn.abacus.util.FloatSummaryStatistics;
import com.landawn.abacus.util.Fn;
import com.landawn.abacus.util.Fn.Suppliers;
import com.landawn.abacus.util.IndexedFloat;
import com.landawn.abacus.util.Joiner;
import com.landawn.abacus.util.KahanSummation;
import com.landawn.abacus.util.MergeResult;
import com.landawn.abacus.util.Multiset;
import com.landawn.abacus.util.MutableFloat;
import com.landawn.abacus.util.MutableInt;
import com.landawn.abacus.util.MutableLong;
import com.landawn.abacus.util.N;
import com.landawn.abacus.util.Pair;
import com.landawn.abacus.util.Percentage;
import com.landawn.abacus.util.StringUtil.Strings;
import com.landawn.abacus.util.Throwables;
import com.landawn.abacus.util.Tuple.Tuple3;
import com.landawn.abacus.util.u.Optional;
import com.landawn.abacus.util.u.OptionalDouble;
import com.landawn.abacus.util.u.OptionalFloat;
import com.landawn.abacus.util.function.BiConsumer;
import com.landawn.abacus.util.function.BinaryOperator;
import com.landawn.abacus.util.function.FloatBiFunction;
import com.landawn.abacus.util.function.FloatBiPredicate;
import com.landawn.abacus.util.function.FloatBinaryOperator;
import com.landawn.abacus.util.function.FloatConsumer;
import com.landawn.abacus.util.function.FloatFunction;
import com.landawn.abacus.util.function.FloatPredicate;
import com.landawn.abacus.util.function.FloatTernaryOperator;
import com.landawn.abacus.util.function.FloatTriPredicate;
import com.landawn.abacus.util.function.Function;
import com.landawn.abacus.util.function.ObjFloatConsumer;
import com.landawn.abacus.util.function.Supplier;
import com.landawn.abacus.util.function.ToFloatFunction;
/**
*
*/
abstract class AbstractFloatStream extends FloatStream {
AbstractFloatStream(final boolean sorted, final Collection closeHandlers) {
super(sorted, closeHandlers);
}
@Override
public FloatStream distinct() {
assertNotClosed();
final Set set = N.newHashSet();
return newStream(this.sequential().filter(value -> set.add(value)).iteratorEx(), sorted);
}
// @Override
// public FloatStream flattMap(final FloatFunction mapper) {
// assertNotClosed();
//
// return flatMap(new FloatFunction() {
// @Override
// public FloatStream apply(float t) {
// return FloatStream.of(mapper.apply(t));
// }
// });
// }
@Override
public FloatStream flattMap(final FloatFunction mapper) {
assertNotClosed();
return flatMap(t -> FloatStream.of(mapper.apply(t)));
}
@Override
public Stream flattMapToObj(final FloatFunction extends Collection> mapper) {
assertNotClosed();
return flatMapToObj(t -> Stream.of(mapper.apply(t)));
}
@Override
public Stream flatMappToObj(final FloatFunction mapper) {
assertNotClosed();
return flatMapToObj(t -> Stream.of(mapper.apply(t)));
}
@Override
public FloatStream mapPartial(final FloatFunction mapper) {
if (isParallel()) {
return mapToObj(mapper).psp(s -> s.filter(Fn.IS_PRESENT_FLOAT).mapToFloat(Fn.GET_AS_FLOAT));
} else {
return mapToObj(mapper).filter(Fn.IS_PRESENT_FLOAT).mapToFloat(Fn.GET_AS_FLOAT);
}
}
@Override
public FloatStream rangeMap(final FloatBiPredicate sameRange, final FloatBinaryOperator mapper) {
assertNotClosed();
final FloatIteratorEx iter = iteratorEx();
return newStream(new FloatIteratorEx() {
private float left = 0, right = 0, next = 0;
private boolean hasNext = false;
@Override
public boolean hasNext() {
return hasNext || iter.hasNext();
}
@Override
public float nextFloat() {
left = hasNext ? next : iter.nextFloat();
right = left;
while (hasNext = iter.hasNext()) {
next = iter.nextFloat();
if (sameRange.test(left, next)) {
right = next;
} else {
break;
}
}
return mapper.applyAsFloat(left, right);
}
}, false);
}
@Override
public Stream rangeMapToObj(final FloatBiPredicate sameRange, final FloatBiFunction mapper) {
assertNotClosed();
final FloatIteratorEx iter = iteratorEx();
return newStream(new ObjIteratorEx() {
private float left = 0, right = 0, next = 0;
private boolean hasNext = false;
@Override
public boolean hasNext() {
return hasNext || iter.hasNext();
}
@Override
public T next() {
left = hasNext ? next : iter.nextFloat();
right = left;
while (hasNext = iter.hasNext()) {
next = iter.nextFloat();
if (sameRange.test(left, next)) {
right = next;
} else {
break;
}
}
return mapper.apply(left, right);
}
}, false, null);
}
@Override
public Stream collapse(final FloatBiPredicate collapsible) {
assertNotClosed();
final FloatIteratorEx iter = iteratorEx();
return newStream(new ObjIteratorEx() {
private boolean hasNext = false;
private float next = 0;
@Override
public boolean hasNext() {
return hasNext || iter.hasNext();
}
@Override
public FloatList next() {
final FloatList result = new FloatList(9);
result.add(hasNext ? next : (next = iter.nextFloat()));
while ((hasNext = iter.hasNext())) {
if (collapsible.test(next, (next = iter.nextFloat()))) {
result.add(next);
} else {
break;
}
}
return result;
}
}, false, null);
}
@Override
public FloatStream collapse(final FloatBiPredicate collapsible, final FloatBinaryOperator mergeFunction) {
assertNotClosed();
final FloatIteratorEx iter = iteratorEx();
return newStream(new FloatIteratorEx() {
private boolean hasNext = false;
private float next = 0;
@Override
public boolean hasNext() {
return hasNext || iter.hasNext();
}
@Override
public float nextFloat() {
float res = hasNext ? next : (next = iter.nextFloat());
while ((hasNext = iter.hasNext())) {
if (collapsible.test(next, (next = iter.nextFloat()))) {
res = mergeFunction.applyAsFloat(res, next);
} else {
break;
}
}
return res;
}
}, false);
}
@Override
public FloatStream collapse(final FloatTriPredicate collapsible, final FloatBinaryOperator mergeFunction) {
assertNotClosed();
final FloatIteratorEx iter = iteratorEx();
return newStream(new FloatIteratorEx() {
private boolean hasNext = false;
private float next = 0;
@Override
public boolean hasNext() {
return hasNext || iter.hasNext();
}
@Override
public float nextFloat() {
final float first = hasNext ? next : (next = iter.nextFloat());
float res = first;
while ((hasNext = iter.hasNext())) {
if (collapsible.test(first, next, (next = iter.nextFloat()))) {
res = mergeFunction.applyAsFloat(res, next);
} else {
break;
}
}
return res;
}
}, false);
}
@Override
public FloatStream skip(final long n, final FloatConsumer action) {
assertNotClosed();
checkArgNotNegative(n, "n");
checkArgNotNull(action, "action");
final FloatPredicate filter = isParallel() ? new FloatPredicate() {
final AtomicLong cnt = new AtomicLong(n);
@Override
public boolean test(float value) {
return cnt.getAndDecrement() > 0;
}
} : new FloatPredicate() {
final MutableLong cnt = MutableLong.of(n);
@Override
public boolean test(float value) {
return cnt.getAndDecrement() > 0;
}
};
return dropWhile(filter, action);
}
@Override
public FloatStream removeIf(final FloatPredicate predicate) {
assertNotClosed();
return filter(value -> !predicate.test(value));
}
@Override
public FloatStream removeIf(final FloatPredicate predicate, final FloatConsumer actionOnDroppedItem) {
assertNotClosed();
return filter(value -> {
if (predicate.test(value)) {
actionOnDroppedItem.accept(value);
return false;
}
return true;
});
}
@Override
public FloatStream filter(final FloatPredicate predicate, final FloatConsumer actionOnDroppedItem) {
assertNotClosed();
return filter(value -> {
if (!predicate.test(value)) {
actionOnDroppedItem.accept(value);
return false;
}
return true;
});
}
@Override
public FloatStream dropWhile(final FloatPredicate predicate, final FloatConsumer actionOnDroppedItem) {
assertNotClosed();
return dropWhile(value -> {
if (predicate.test(value)) {
actionOnDroppedItem.accept(value);
return true;
}
return false;
});
}
@Override
public FloatStream step(final long step) {
assertNotClosed();
checkArgPositive(step, "step");
if (step == 1) {
return skip(0);
}
final long skip = step - 1;
final FloatIteratorEx iter = this.iteratorEx();
final FloatIterator floatIterator = new FloatIteratorEx() {
@Override
public boolean hasNext() {
return iter.hasNext();
}
@Override
public float nextFloat() {
final float next = iter.nextFloat();
iter.advance(skip);
return next;
}
};
return newStream(floatIterator, sorted);
}
@Override
public Stream split(final int chunkSize) {
assertNotClosed();
return splitToList(chunkSize).map(t -> new ArrayFloatStream(t.array(), 0, t.size(), sorted, null));
}
@Override
public Stream split(final FloatPredicate predicate) {
assertNotClosed();
return splitToList(predicate).map(t -> new ArrayFloatStream(t.array(), 0, t.size(), sorted, null));
}
@Override
public Stream splitAt(final FloatPredicate where) {
assertNotClosed();
final FloatIteratorEx iter = iteratorEx();
return newStream(new ObjIteratorEx() {
private int cursor = 0;
private float next = 0;
private boolean hasNext = false;
@Override
public boolean hasNext() {
return cursor < 2;
}
@Override
public FloatStream next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
FloatStream result = null;
if (cursor == 0) {
final FloatList list = new FloatList();
while (iter.hasNext()) {
next = iter.nextFloat();
if (!where.test(next)) {
list.add(next);
} else {
hasNext = true;
break;
}
}
result = new ArrayFloatStream(list.array(), 0, list.size(), sorted, null);
} else {
FloatIteratorEx iterEx = iter;
if (hasNext) {
iterEx = new FloatIteratorEx() {
private boolean isFirst = true;
@Override
public boolean hasNext() {
return isFirst || iter.hasNext();
}
@Override
public float nextFloat() {
if (!hasNext()) {
throw new NoSuchElementException();
}
if (isFirst) {
isFirst = false;
return next;
} else {
return iter.nextFloat();
}
}
};
}
result = new IteratorFloatStream(iterEx, sorted, null);
}
cursor++;
return result;
}
@Override
public long count() {
iter.count();
return 2 - cursor;
}
@Override
public void advance(long n) {
if (n == 0) {
return;
} else if (n == 1) {
if (cursor == 0) {
while (iter.hasNext()) {
next = iter.nextFloat();
if (!where.test(next)) {
hasNext = true;
break;
}
}
} else {
iter.advance(Long.MAX_VALUE);
}
} else {
iter.advance(Long.MAX_VALUE);
}
cursor = n >= 2 ? 2 : cursor + (int) n;
}
}, false, null);
}
@Override
public Stream sliding(final int windowSize, final int increment) {
assertNotClosed();
return slidingToList(windowSize, increment).map(t -> new ArrayFloatStream(t.array(), 0, t.size(), sorted, null));
}
@Override
public FloatStream scan(final FloatBinaryOperator accumulator) {
assertNotClosed();
final FloatIteratorEx iter = iteratorEx();
return newStream(new FloatIteratorEx() {
private float res = 0;
private boolean isFirst = true;
@Override
public boolean hasNext() {
return iter.hasNext();
}
@Override
public float nextFloat() {
if (isFirst) {
isFirst = false;
return (res = iter.nextFloat());
} else {
return (res = accumulator.applyAsFloat(res, iter.nextFloat()));
}
}
}, false);
}
@Override
public FloatStream scan(final float init, final FloatBinaryOperator accumulator) {
assertNotClosed();
final FloatIteratorEx iter = iteratorEx();
return newStream(new FloatIteratorEx() {
private float res = init;
@Override
public boolean hasNext() {
return iter.hasNext();
}
@Override
public float nextFloat() {
return (res = accumulator.applyAsFloat(res, iter.nextFloat()));
}
}, false);
}
@Override
public FloatStream scan(final float init, final FloatBinaryOperator accumulator, final boolean initIncluded) {
assertNotClosed();
if (!initIncluded) {
return scan(init, accumulator);
}
final FloatIteratorEx iter = iteratorEx();
return newStream(new FloatIteratorEx() {
private boolean isFirst = true;
private float res = init;
@Override
public boolean hasNext() {
return isFirst || iter.hasNext();
}
@Override
public float nextFloat() {
if (isFirst) {
isFirst = false;
return init;
}
return (res = accumulator.applyAsFloat(res, iter.nextFloat()));
}
}, false);
}
@Override
public FloatStream top(int n) {
assertNotClosed();
return top(n, FLOAT_COMPARATOR);
}
@Override
public FloatStream intersection(final Collection> c) {
assertNotClosed();
final Multiset> multiset = Multiset.from(c);
return newStream(this.sequential().filter(value -> multiset.getAndRemove(value) > 0).iteratorEx(), sorted);
}
@Override
public FloatStream difference(final Collection> c) {
assertNotClosed();
final Multiset> multiset = Multiset.from(c);
return newStream(this.sequential().filter(value -> multiset.getAndRemove(value) < 1).iteratorEx(), sorted);
}
@Override
public FloatStream symmetricDifference(final Collection c) {
assertNotClosed();
final Multiset> multiset = Multiset.from(c);
return newStream(this.sequential()
.filter(value -> multiset.getAndRemove(value) < 1)
.append(Stream.of(c).filter(value -> multiset.getAndRemove(value) > 0).mapToFloat(ToFloatFunction.UNBOX))
.iteratorEx(), false);
}
@Override
public FloatStream reversed() {
assertNotClosed();
return newStream(new FloatIteratorEx() {
private boolean initialized = false;
private float[] elements;
private int fromIndex = -1;
private int toIndex = -1;
private int cursor;
@Override
public boolean hasNext() {
if (!initialized) {
init();
}
return cursor > fromIndex;
}
@Override
public float nextFloat() {
if (!initialized) {
init();
}
if (cursor <= fromIndex) {
throw new NoSuchElementException();
}
return elements[--cursor];
}
@Override
public long count() {
if (!initialized) {
init();
}
return cursor - fromIndex;
}
@Override
public void advance(long n) {
if (!initialized) {
init();
}
cursor = n < cursor - fromIndex ? cursor - (int) n : fromIndex;
}
@Override
public float[] toArray() {
if (!initialized) {
init();
}
final float[] a = new float[cursor - fromIndex];
for (int i = 0, len = cursor - fromIndex; i < len; i++) {
a[i] = elements[cursor - i - 1];
}
return a;
}
private void init() {
if (!initialized) {
initialized = true;
final Tuple3 tp = AbstractFloatStream.this.arrayForIntermediateOp();
elements = tp._1;
fromIndex = tp._2;
toIndex = tp._3;
cursor = toIndex;
}
}
}, false);
}
@Override
public FloatStream rotated(final int distance) {
assertNotClosed();
return newStream(new FloatIteratorEx() {
private boolean initialized = false;
private float[] elements;
private int fromIndex = -1;
private int toIndex = -1;
private int len;
private int start;
private int cnt = 0;
@Override
public boolean hasNext() {
if (!initialized) {
init();
}
return cnt < len;
}
@Override
public float nextFloat() {
if (!hasNext()) {
throw new NoSuchElementException();
}
return elements[((start + cnt++) % len) + fromIndex];
}
@Override
public long count() {
if (!initialized) {
init();
}
return len - cnt;
}
@Override
public void advance(long n) {
if (!initialized) {
init();
}
cnt = n < len - cnt ? cnt + (int) n : len;
}
@Override
public float[] toArray() {
if (!initialized) {
init();
}
final float[] a = new float[len - cnt];
for (int i = cnt; i < len; i++) {
a[i - cnt] = elements[((start + i) % len) + fromIndex];
}
return a;
}
private void init() {
if (!initialized) {
initialized = true;
final Tuple3 tp = AbstractFloatStream.this.arrayForIntermediateOp();
elements = tp._1;
fromIndex = tp._2;
toIndex = tp._3;
len = toIndex - fromIndex;
if (len > 0) {
start = distance % len;
if (start < 0) {
start += len;
}
start = len - start;
}
}
}
}, distance == 0 && sorted);
}
@Override
public FloatStream shuffled(final Random rnd) {
assertNotClosed();
checkArgNotNull(rnd, "random");
return lazyLoad(a -> {
N.shuffle(a, rnd);
return a;
}, false);
}
@Override
public FloatStream sorted() {
assertNotClosed();
if (sorted) {
return newStream(iteratorEx(), sorted);
}
return lazyLoad(a -> {
if (isParallel()) {
N.parallelSort(a);
} else {
N.sort(a);
}
return a;
}, true);
}
@Override
public FloatStream reverseSorted() {
assertNotClosed();
return newStream(new FloatIteratorEx() {
private boolean initialized = false;
private float[] aar;
private int cursor;
@Override
public boolean hasNext() {
if (!initialized) {
init();
}
return cursor > 0;
}
@Override
public float nextFloat() {
if (!initialized) {
init();
}
if (cursor <= 0) {
throw new NoSuchElementException();
}
return aar[--cursor];
}
@Override
public long count() {
if (!initialized) {
init();
}
return cursor;
}
@Override
public void advance(long n) {
if (!initialized) {
init();
}
cursor = n < cursor ? cursor - (int) n : 0;
}
@Override
public float[] toArray() {
if (!initialized) {
init();
}
final float[] a = new float[cursor];
for (int i = 0; i < cursor; i++) {
a[i] = aar[cursor - i - 1];
}
return a;
}
private void init() {
if (!initialized) {
initialized = true;
aar = AbstractFloatStream.this.toArrayForIntermediateOp();
if (isParallel()) {
N.parallelSort(aar);
} else {
N.sort(aar);
}
cursor = aar.length;
}
}
}, false);
}
private FloatStream lazyLoad(final Function op, final boolean sorted) {
return newStream(new FloatIteratorEx() {
private boolean initialized = false;
private float[] aar;
private int cursor = 0;
private int len;
@Override
public boolean hasNext() {
if (!initialized) {
init();
}
return cursor < len;
}
@Override
public float nextFloat() {
if (!initialized) {
init();
}
if (cursor >= len) {
throw new NoSuchElementException();
}
return aar[cursor++];
}
@Override
public long count() {
if (!initialized) {
init();
}
return len - cursor;
}
@Override
public void advance(long n) {
if (!initialized) {
init();
}
cursor = n > len - cursor ? len : cursor + (int) n;
}
@Override
public float[] toArray() {
if (!initialized) {
init();
}
final float[] a = new float[len - cursor];
for (int i = cursor; i < len; i++) {
a[i - cursor] = aar[i];
}
return a;
}
private void init() {
if (!initialized) {
initialized = true;
aar = op.apply(AbstractFloatStream.this.toArrayForIntermediateOp());
len = aar.length;
}
}
}, sorted);
}
@Override
public FloatStream cycled() {
assertNotClosed();
return newStream(new FloatIterator() {
private FloatIterator iter = null;
private FloatList list = null;
private float[] a = null;
private int len = 0;
private int cursor = -1;
private float e = 0;
private boolean initialized = false;
@Override
public boolean hasNext() {
if (!initialized) {
init();
}
if (a == null && !iter.hasNext()) {
a = list.toArray();
len = a.length;
cursor = 0;
}
return cursor < len || iter.hasNext();
}
@Override
public float nextFloat() {
if (!hasNext()) {
throw new NoSuchElementException();
}
if (len > 0) {
if (cursor >= len) {
cursor = 0;
}
return a[cursor++];
} else {
e = iter.nextFloat();
list.add(e);
return e;
}
}
private void init() {
if (!initialized) {
initialized = true;
iter = AbstractFloatStream.this.iteratorEx();
list = new FloatList();
}
}
}, false);
}
@Override
public FloatStream cycled(final long rounds) {
assertNotClosed();
checkArgNotNegative(rounds, "times");
if (rounds == 0) {
return limit(0);
} else if (rounds == 1) {
return skip(0);
}
return newStream(new FloatIterator() {
private FloatIterator iter = null;
private FloatList list = null;
private float[] a = null;
private int len = 0;
private int cursor = -1;
private float e = 0;
private long m = 0;
private boolean initialized = false;
@Override
public boolean hasNext() {
if (!initialized) {
init();
}
if (a == null && !iter.hasNext()) {
a = list.toArray();
len = a.length;
cursor = 0;
m = 1;
}
return m < rounds && (cursor < len || rounds - m > 1) && (len > 0 || iter.hasNext());
}
@Override
public float nextFloat() {
if (!hasNext()) {
throw new NoSuchElementException();
}
if (len > 0) {
if (cursor >= len) {
cursor = 0;
m++;
}
return a[cursor++];
} else {
e = iter.nextFloat();
list.add(e);
return e;
}
}
private void init() {
if (!initialized) {
initialized = true;
iter = AbstractFloatStream.this.iteratorEx();
list = new FloatList();
}
}
}, rounds <= 1 ? this.sorted : false);
}
@Override
public Stream indexed() {
assertNotClosed();
final MutableLong idx = MutableLong.of(0);
return newStream(this.sequential().mapToObj(t -> IndexedFloat.of(t, idx.getAndIncrement())).iteratorEx(), true, INDEXED_FLOAT_COMPARATOR);
}
@Override
public Stream boxed() {
assertNotClosed();
return newStream(iteratorEx(), sorted, sorted ? FLOAT_COMPARATOR : null);
}
@Override
@SafeVarargs
public final FloatStream prepend(final float... a) {
assertNotClosed();
return prepend(FloatStream.of(a));
}
@Override
public FloatStream prepend(FloatStream stream) {
assertNotClosed();
if (isParallel()) {
return FloatStream.concat(stream, this).parallel(maxThreadNum(), splitor(), asyncExecutor(), cancelUncompletedThreads());
} else {
return FloatStream.concat(stream, this);
}
}
@Override
public FloatStream prepend(final OptionalFloat op) {
assertNotClosed();
return prepend(op.stream());
}
@Override
@SafeVarargs
public final FloatStream append(final float... a) {
assertNotClosed();
return append(FloatStream.of(a));
}
@Override
public FloatStream append(FloatStream stream) {
assertNotClosed();
if (isParallel()) {
return FloatStream.concat(this, stream).parallel(maxThreadNum(), splitor(), asyncExecutor(), cancelUncompletedThreads());
} else {
return FloatStream.concat(this, stream);
}
}
@Override
public FloatStream append(final OptionalFloat op) {
assertNotClosed();
return prepend(op.stream());
}
@Override
@SafeVarargs
public final FloatStream appendIfEmpty(final float... a) {
assertNotClosed();
return appendIfEmpty(() -> FloatStream.of(a));
}
@Override
public FloatStream mergeWith(FloatStream b, FloatBiFunction nextSelector) {
assertNotClosed();
if (isParallel()) {
return FloatStream.merge(this, b, nextSelector).parallel(maxThreadNum(), splitor(), asyncExecutor(), cancelUncompletedThreads());
} else {
return FloatStream.merge(this, b, nextSelector);
}
}
@Override
public FloatStream zipWith(FloatStream b, FloatBinaryOperator zipFunction) {
assertNotClosed();
return FloatStream.zip(this, b, zipFunction);
}
@Override
public FloatStream zipWith(FloatStream b, FloatStream c, FloatTernaryOperator zipFunction) {
assertNotClosed();
return FloatStream.zip(this, b, c, zipFunction);
}
@Override
public FloatStream zipWith(FloatStream b, float valueForNoneA, float valueForNoneB, FloatBinaryOperator zipFunction) {
assertNotClosed();
return FloatStream.zip(this, b, valueForNoneA, valueForNoneB, zipFunction);
}
@Override
public FloatStream zipWith(FloatStream b, FloatStream c, float valueForNoneA, float valueForNoneB, float valueForNoneC, FloatTernaryOperator zipFunction) {
assertNotClosed();
return FloatStream.zip(this, b, c, valueForNoneA, valueForNoneB, valueForNoneC, zipFunction);
}
// @Override
// public FloatStream cached() {
// return newStream(toArray(), sorted);
// }
@Override
public Map toMap(Throwables.FloatFunction extends K, E> keyMapper,
Throwables.FloatFunction extends V, E2> valueMapper) throws E, E2 {
assertNotClosed();
return toMap(keyMapper, valueMapper, Suppliers. ofMap());
}
@Override
public , E extends Exception, E2 extends Exception> M toMap(Throwables.FloatFunction extends K, E> keyMapper,
Throwables.FloatFunction extends V, E2> valueMapper, Supplier extends M> mapFactory) throws E, E2 {
assertNotClosed();
return toMap(keyMapper, valueMapper, Fn. throwingMerger(), mapFactory);
}
@Override
public Map toMap(Throwables.FloatFunction extends K, E> keyMapper,
Throwables.FloatFunction extends V, E2> valueMapper, BinaryOperator mergeFunction) throws E, E2 {
assertNotClosed();
return toMap(keyMapper, valueMapper, mergeFunction, Suppliers. ofMap());
}
@Override
public Map groupTo(Throwables.FloatFunction extends K, E> keyMapper, final Collector downstream)
throws E {
assertNotClosed();
return groupTo(keyMapper, downstream, Suppliers. ofMap());
}
@Override
public void forEachIndexed(Throwables.IndexedFloatConsumer action) throws E {
assertNotClosed();
if (isParallel()) {
final AtomicInteger idx = new AtomicInteger(0);
forEach(t -> action.accept(idx.getAndIncrement(), t));
} else {
final MutableInt idx = MutableInt.of(0);
forEach(t -> action.accept(idx.getAndIncrement(), t));
}
}
@Override
public double sum() {
assertNotClosed();
try {
return summation().sum();
} finally {
close();
}
}
private KahanSummation summation() {
final KahanSummation summation = new KahanSummation();
final FloatConsumer action = t -> summation.add(t);
this.forEach(action);
return summation;
}
@Override
public OptionalDouble average() {
assertNotClosed();
try {
return summation().average();
} finally {
close();
}
}
@Override
public OptionalFloat first() {
assertNotClosed();
try {
final FloatIterator iter = this.iteratorEx();
return iter.hasNext() ? OptionalFloat.of(iter.nextFloat()) : OptionalFloat.empty();
} finally {
close();
}
}
@Override
public OptionalFloat last() {
assertNotClosed();
try {
final FloatIterator iter = this.iteratorEx();
if (!iter.hasNext()) {
return OptionalFloat.empty();
}
float next = iter.nextFloat();
while (iter.hasNext()) {
next = iter.nextFloat();
}
return OptionalFloat.of(next);
} finally {
close();
}
}
@Override
public OptionalFloat onlyOne() throws DuplicatedResultException {
assertNotClosed();
try {
final FloatIterator iter = this.iteratorEx();
final OptionalFloat result = iter.hasNext() ? OptionalFloat.of(iter.nextFloat()) : OptionalFloat.empty();
if (result.isPresent() && iter.hasNext()) {
throw new DuplicatedResultException("There are at least two elements: " + Strings.concat(result.get(), ", ", iter.nextFloat()));
}
return result;
} finally {
close();
}
}
@Override
public OptionalFloat findAny(final Throwables.FloatPredicate predicate) throws E {
assertNotClosed();
return findFirst(predicate);
}
@Override
public OptionalFloat findFirstOrLast(Throwables.FloatPredicate predicateForFirst,
Throwables.FloatPredicate predicateForLast) throws E, E2 {
assertNotClosed();
try {
final FloatIteratorEx iter = iteratorEx();
MutableFloat last = null;
float next = 0;
while (iter.hasNext()) {
next = iter.nextFloat();
if (predicateForFirst.test(next)) {
return OptionalFloat.of(next);
} else if (predicateForLast.test(next)) {
if (last == null) {
last = MutableFloat.of(next);
} else {
last.setValue(next);
}
}
}
return last == null ? OptionalFloat.empty() : OptionalFloat.of(last.value());
} finally {
close();
}
}
@Override
public Optional> percentiles() {
assertNotClosed();
try {
final float[] a = sorted().toArray();
if (a.length == 0) {
return Optional.empty();
}
return Optional.of(N.percentiles(a));
} finally {
close();
}
}
@Override
public Pair>> summarizeAndPercentiles() {
assertNotClosed();
try {
final float[] a = sorted().toArray();
if (N.isNullOrEmpty(a)) {
return Pair.of(new FloatSummaryStatistics(), Optional.> empty());
} else {
return Pair.of(new FloatSummaryStatistics(a.length, sum(a), a[0], a[a.length - 1]), Optional.of(N.percentiles(a)));
}
} finally {
close();
}
}
@Override
public String join(final CharSequence delimiter, final CharSequence prefix, final CharSequence suffix) {
assertNotClosed();
try {
final Joiner joiner = Joiner.with(delimiter, prefix, suffix).reuseCachedBuffer();
final FloatIteratorEx iter = this.iteratorEx();
while (iter.hasNext()) {
joiner.append(iter.nextFloat());
}
return joiner.toString();
} finally {
close();
}
}
@Override
public R collect(Supplier supplier, ObjFloatConsumer super R> accumulator) {
assertNotClosed();
final BiConsumer combiner = collectingCombiner;
return collect(supplier, accumulator, combiner);
}
}