1ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin/* 2ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. 3ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * 5ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * This code is free software; you can redistribute it and/or modify it 6ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * under the terms of the GNU General Public License version 2 only, as 7ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * published by the Free Software Foundation. Oracle designates this 8ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * particular file as subject to the "Classpath" exception as provided 9ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * by Oracle in the LICENSE file that accompanied this code. 10ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * 11ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * This code is distributed in the hope that it will be useful, but WITHOUT 12ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * version 2 for more details (a copy is included in the LICENSE file that 15ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * accompanied this code). 16ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * 17ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * You should have received a copy of the GNU General Public License version 18ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * 2 along with this work; if not, write to the Free Software Foundation, 19ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * 21ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * or visit www.oracle.com if you need additional information or have any 23ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * questions. 24ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin */ 25ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinpackage java.util.stream; 26ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 27ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.LongSummaryStatistics; 28ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.Objects; 29ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.OptionalDouble; 30ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.OptionalLong; 31ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.PrimitiveIterator; 32ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.Spliterator; 33ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.Spliterators; 34ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.function.BiConsumer; 35ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.function.BinaryOperator; 36ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.function.IntFunction; 37ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.function.LongBinaryOperator; 38ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.function.LongConsumer; 39ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.function.LongFunction; 40ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.function.LongPredicate; 41ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.function.LongToDoubleFunction; 42ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.function.LongToIntFunction; 43ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.function.LongUnaryOperator; 44ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.function.ObjLongConsumer; 45ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkinimport java.util.function.Supplier; 46ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 47ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin/** 48ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * Abstract base class for an intermediate pipeline stage or pipeline source 49ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * stage implementing whose elements are of type {@code long}. 50ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * 51ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * @paramtype of elements in the upstream source 52ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * @since 1.8 53289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * @hide Visible for CTS testing only (OpenJDK8 tests). 54ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin */ 55289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkinpublic abstract class LongPipeline<E_IN> 56ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin extends AbstractPipeline<E_IN, Long, LongStream> 57ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin implements LongStream { 58ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 59ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin /** 60ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * Constructor for the head of a stream pipeline. 61ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * 62ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * @param source {@code Supplier<Spliterator>} describing the stream source 63ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * @param sourceFlags the source flags for the stream source, described in 64ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * {@link StreamOpFlag} 65ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * @param parallel {@code true} if the pipeline is parallel 66ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin */ 67ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin LongPipeline(Supplier<? extends Spliterator<Long>> source, 68ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin int sourceFlags, boolean parallel) { 69ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin super(source, sourceFlags, parallel); 70ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 71ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 72ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin /** 73ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * Constructor for the head of a stream pipeline. 74ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * 75ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * @param source {@code Spliterator} describing the stream source 76ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * @param sourceFlags the source flags for the stream source, described in 77ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * {@link StreamOpFlag} 78ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * @param parallel {@code true} if the pipeline is parallel 79ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin */ 80ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin LongPipeline(Spliterator<Long> source, 81ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin int sourceFlags, boolean parallel) { 82ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin super(source, sourceFlags, parallel); 83ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 84ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 85ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin /** 86ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * Constructor for appending an intermediate operation onto an existing pipeline. 87ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * 88ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * @param upstream the upstream element source. 89ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * @param opFlags the operation flags 90ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin */ 91ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin LongPipeline(AbstractPipeline<?, E_IN, ?> upstream, int opFlags) { 92ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin super(upstream, opFlags); 93ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 94ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 95ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin /** 96ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * Adapt a {@code Sink<Long> to an {@code LongConsumer}, ideally simply 97ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * by casting. 98ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin */ 99ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin private static LongConsumer adapt(Sink<Long> sink) { 100ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin if (sink instanceof LongConsumer) { 101ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return (LongConsumer) sink; 102ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } else { 103ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin if (Tripwire.ENABLED) 104ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin Tripwire.trip(AbstractPipeline.class, 105ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin "using LongStream.adapt(Sink<Long> s)"); 106ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return sink::accept; 107ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 108ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 109ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 110ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin /** 111ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * Adapt a {@code Spliterator<Long>} to a {@code Spliterator.OfLong}. 112ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * 113ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * @implNote 114ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * The implementation attempts to cast to a Spliterator.OfLong, and throws 115ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * an exception if this cast is not possible. 116ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin */ 117ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin private static Spliterator.OfLong adapt(Spliterator<Long> s) { 118ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin if (s instanceof Spliterator.OfLong) { 119ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return (Spliterator.OfLong) s; 120ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } else { 121ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin if (Tripwire.ENABLED) 122ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin Tripwire.trip(AbstractPipeline.class, 123ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin "using LongStream.adapt(Spliterator<Long> s)"); 124ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin throw new UnsupportedOperationException("LongStream.adapt(Spliterator<Long> s)"); 125ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 126ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 127ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 128ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 129ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin // Shape-specific methods 130ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 131ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 132289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public final StreamShape getOutputShape() { 133ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return StreamShape.LONG_VALUE; 134ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 135ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 136ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 137289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public final <P_IN> Node<Long> evaluateToNode(PipelineHelper<Long> helper, 138ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin Spliterator<P_IN> spliterator, 139ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin boolean flattenTree, 140ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin IntFunction<Long[]> generator) { 141ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return Nodes.collectLong(helper, spliterator, flattenTree); 142ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 143ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 144ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 145289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public final <P_IN> Spliterator<Long> wrap(PipelineHelper<Long> ph, 146ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin Supplier<Spliterator<P_IN>> supplier, 147ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin boolean isParallel) { 148ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return new StreamSpliterators.LongWrappingSpliterator<>(ph, supplier, isParallel); 149ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 150ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 151ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 152ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @SuppressWarnings("unchecked") 153289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public final Spliterator.OfLong lazySpliterator(Supplier<? extends Spliterator<Long>> supplier) { 154ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return new StreamSpliterators.DelegatingSpliterator.OfLong((Supplier<Spliterator.OfLong>) supplier); 155ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 156ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 157ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 158289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public final void forEachWithCancel(Spliterator<Long> spliterator, Sink<Long> sink) { 159ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin Spliterator.OfLong spl = adapt(spliterator); 160ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin LongConsumer adaptedSink = adapt(sink); 161ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin do { } while (!sink.cancellationRequested() && spl.tryAdvance(adaptedSink)); 162ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 163ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 164ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 165289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public final Node.Builder<Long> makeNodeBuilder(long exactSizeIfKnown, IntFunction<Long[]> generator) { 166ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return Nodes.longBuilder(exactSizeIfKnown); 167ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 168ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 169ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 170ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin // LongStream 171ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 172ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 173ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public final PrimitiveIterator.OfLong iterator() { 174ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return Spliterators.iterator(spliterator()); 175ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 176ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 177ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 178ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public final Spliterator.OfLong spliterator() { 179ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return adapt(super.spliterator()); 180ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 181ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 182ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin // Stateless intermediate ops from LongStream 183ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 184ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 185ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public final DoubleStream asDoubleStream() { 186ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return new DoublePipeline.StatelessOp<Long>(this, StreamShape.LONG_VALUE, 187ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin StreamOpFlag.NOT_SORTED | StreamOpFlag.NOT_DISTINCT) { 188ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 189289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public Sink<Long> opWrapSink(int flags, Sink<Double> sink) { 190ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return new Sink.ChainedLong<Double>(sink) { 191ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 192ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public void accept(long t) { 193ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin downstream.accept((double) t); 194ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 195ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin }; 196ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 197ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin }; 198ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 199ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 200ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 201ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public final Stream<Long> boxed() { 202ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return mapToObj(Long::valueOf); 203ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 204ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 205ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 206ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public final LongStream map(LongUnaryOperator mapper) { 207ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin Objects.requireNonNull(mapper); 208ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return new StatelessOp<Long>(this, StreamShape.LONG_VALUE, 209ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin StreamOpFlag.NOT_SORTED | StreamOpFlag.NOT_DISTINCT) { 210ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 211289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public Sink<Long> opWrapSink(int flags, Sink<Long> sink) { 212ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return new Sink.ChainedLong<Long>(sink) { 213ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 214ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public void accept(long t) { 215ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin downstream.accept(mapper.applyAsLong(t)); 216ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 217ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin }; 218ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 219ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin }; 220ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 221ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 222ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 223ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public final <U> Stream<U> mapToObj(LongFunction<? extends U> mapper) { 224ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin Objects.requireNonNull(mapper); 225ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return new ReferencePipeline.StatelessOp<Long, U>(this, StreamShape.LONG_VALUE, 226ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin StreamOpFlag.NOT_SORTED | StreamOpFlag.NOT_DISTINCT) { 227ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 228289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public Sink<Long> opWrapSink(int flags, Sink<U> sink) { 229ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return new Sink.ChainedLong<U>(sink) { 230ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 231ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public void accept(long t) { 232ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin downstream.accept(mapper.apply(t)); 233ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 234ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin }; 235ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 236ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin }; 237ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 238ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 239ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 240ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public final IntStream mapToInt(LongToIntFunction mapper) { 241ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin Objects.requireNonNull(mapper); 242ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return new IntPipeline.StatelessOp<Long>(this, StreamShape.LONG_VALUE, 243ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin StreamOpFlag.NOT_SORTED | StreamOpFlag.NOT_DISTINCT) { 244ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 245289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public Sink<Long> opWrapSink(int flags, Sink<Integer> sink) { 246ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return new Sink.ChainedLong<Integer>(sink) { 247ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 248ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public void accept(long t) { 249ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin downstream.accept(mapper.applyAsInt(t)); 250ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 251ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin }; 252ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 253ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin }; 254ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 255ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 256ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 257ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public final DoubleStream mapToDouble(LongToDoubleFunction mapper) { 258ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin Objects.requireNonNull(mapper); 259ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return new DoublePipeline.StatelessOp<Long>(this, StreamShape.LONG_VALUE, 260ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin StreamOpFlag.NOT_SORTED | StreamOpFlag.NOT_DISTINCT) { 261ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 262289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public Sink<Long> opWrapSink(int flags, Sink<Double> sink) { 263ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return new Sink.ChainedLong<Double>(sink) { 264ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 265ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public void accept(long t) { 266ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin downstream.accept(mapper.applyAsDouble(t)); 267ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 268ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin }; 269ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 270ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin }; 271ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 272ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 273ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 274ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public final LongStream flatMap(LongFunction<? extends LongStream> mapper) { 275ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return new StatelessOp<Long>(this, StreamShape.LONG_VALUE, 276ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin StreamOpFlag.NOT_SORTED | StreamOpFlag.NOT_DISTINCT | StreamOpFlag.NOT_SIZED) { 277ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 278289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public Sink<Long> opWrapSink(int flags, Sink<Long> sink) { 279ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return new Sink.ChainedLong<Long>(sink) { 280ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 281ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public void begin(long size) { 282ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin downstream.begin(-1); 283ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 284ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 285ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 286ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public void accept(long t) { 287ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin try (LongStream result = mapper.apply(t)) { 288ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin // We can do better that this too; optimize for depth=0 case and just grab spliterator and forEach it 289ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin if (result != null) 290ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin result.sequential().forEach(i -> downstream.accept(i)); 291ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 292ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 293ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin }; 294ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 295ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin }; 296ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 297ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 298ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 299ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public LongStream unordered() { 300ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin if (!isOrdered()) 301ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return this; 302ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return new StatelessOp<Long>(this, StreamShape.LONG_VALUE, StreamOpFlag.NOT_ORDERED) { 303ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 304289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public Sink<Long> opWrapSink(int flags, Sink<Long> sink) { 305ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return sink; 306ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 307ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin }; 308ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 309ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 310ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 311ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public final LongStream filter(LongPredicate predicate) { 312ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin Objects.requireNonNull(predicate); 313ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return new StatelessOp<Long>(this, StreamShape.LONG_VALUE, 314ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin StreamOpFlag.NOT_SIZED) { 315ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 316289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public Sink<Long> opWrapSink(int flags, Sink<Long> sink) { 317ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return new Sink.ChainedLong<Long>(sink) { 318ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 319ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public void begin(long size) { 320ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin downstream.begin(-1); 321ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 322ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 323ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 324ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public void accept(long t) { 325ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin if (predicate.test(t)) 326ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin downstream.accept(t); 327ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 328ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin }; 329ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 330ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin }; 331ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 332ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 333ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 334ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public final LongStream peek(LongConsumer action) { 335ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin Objects.requireNonNull(action); 336ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return new StatelessOp<Long>(this, StreamShape.LONG_VALUE, 337ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 0) { 338ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 339289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public Sink<Long> opWrapSink(int flags, Sink<Long> sink) { 340ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return new Sink.ChainedLong<Long>(sink) { 341ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 342ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public void accept(long t) { 343ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin action.accept(t); 344ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin downstream.accept(t); 345ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 346ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin }; 347ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 348ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin }; 349ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 350ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 351ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin // Stateful intermediate ops from LongStream 352ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 353ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 354ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public final LongStream limit(long maxSize) { 355ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin if (maxSize < 0) 356ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin throw new IllegalArgumentException(Long.toString(maxSize)); 357ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return SliceOps.makeLong(this, 0, maxSize); 358ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 359ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 360ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 361ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public final LongStream skip(long n) { 362ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin if (n < 0) 363ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin throw new IllegalArgumentException(Long.toString(n)); 364ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin if (n == 0) 365ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return this; 366ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin else 367ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return SliceOps.makeLong(this, n, -1); 368ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 369ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 370ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 371ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public final LongStream sorted() { 372ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return SortedOps.makeLong(this); 373ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 374ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 375ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 376ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public final LongStream distinct() { 377ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin // While functional and quick to implement, this approach is not very efficient. 378ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin // An efficient version requires a long-specific map/set implementation. 379ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return boxed().distinct().mapToLong(i -> (long) i); 380ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 381ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 382ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin // Terminal ops from LongStream 383ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 384ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 385ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public void forEach(LongConsumer action) { 386ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin evaluate(ForEachOps.makeLong(action, false)); 387ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 388ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 389ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 390ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public void forEachOrdered(LongConsumer action) { 391ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin evaluate(ForEachOps.makeLong(action, true)); 392ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 393ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 394ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 395ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public final long sum() { 396ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin // use better algorithm to compensate for intermediate overflow? 397ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return reduce(0, Long::sum); 398ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 399ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 400ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 401ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public final OptionalLong min() { 402ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return reduce(Math::min); 403ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 404ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 405ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 406ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public final OptionalLong max() { 407ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return reduce(Math::max); 408ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 409ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 410ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 411ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public final OptionalDouble average() { 412ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin long[] avg = collect(() -> new long[2], 413ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin (ll, i) -> { 414ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin ll[0]++; 415ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin ll[1] += i; 416ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin }, 417ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin (ll, rr) -> { 418ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin ll[0] += rr[0]; 419ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin ll[1] += rr[1]; 420ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin }); 421ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return avg[0] > 0 422ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin ? OptionalDouble.of((double) avg[1] / avg[0]) 423ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin : OptionalDouble.empty(); 424ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 425ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 426ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 427ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public final long count() { 428ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return map(e -> 1L).sum(); 429ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 430ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 431ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 432ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public final LongSummaryStatistics summaryStatistics() { 433ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return collect(LongSummaryStatistics::new, LongSummaryStatistics::accept, 434ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin LongSummaryStatistics::combine); 435ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 436ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 437ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 438ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public final long reduce(long identity, LongBinaryOperator op) { 439ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return evaluate(ReduceOps.makeLong(identity, op)); 440ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 441ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 442ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 443ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public final OptionalLong reduce(LongBinaryOperator op) { 444ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return evaluate(ReduceOps.makeLong(op)); 445ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 446ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 447ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 448ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public final <R> R collect(Supplier<R> supplier, 449ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin ObjLongConsumer<R> accumulator, 450ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin BiConsumer<R, R> combiner) { 451ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin BinaryOperator<R> operator = (left, right) -> { 452ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin combiner.accept(left, right); 453ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return left; 454ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin }; 455ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return evaluate(ReduceOps.makeLong(supplier, accumulator, operator)); 456ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 457ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 458ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 459ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public final boolean anyMatch(LongPredicate predicate) { 460ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return evaluate(MatchOps.makeLong(predicate, MatchOps.MatchKind.ANY)); 461ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 462ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 463ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 464ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public final boolean allMatch(LongPredicate predicate) { 465ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return evaluate(MatchOps.makeLong(predicate, MatchOps.MatchKind.ALL)); 466ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 467ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 468ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 469ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public final boolean noneMatch(LongPredicate predicate) { 470ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return evaluate(MatchOps.makeLong(predicate, MatchOps.MatchKind.NONE)); 471ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 472ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 473ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 474ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public final OptionalLong findFirst() { 475ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return evaluate(FindOps.makeLong(true)); 476ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 477ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 478ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 479ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public final OptionalLong findAny() { 480ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return evaluate(FindOps.makeLong(false)); 481ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 482ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 483ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 484ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public final long[] toArray() { 485ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return Nodes.flattenLong((Node.OfLong) evaluateToArrayNode(Long[]::new)) 486ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin .asPrimitiveArray(); 487ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 488ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 489ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 490ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin // 491ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 492ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin /** 493ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * Source stage of a LongPipeline. 494ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * 495ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * @param type of elements in the upstream source 496ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * @since 1.8 497289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * @hide Visibility for CTS only (OpenJDK 8 streams tests). 498ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin */ 499289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public static class Head<E_IN> extends LongPipeline<E_IN> { 500ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin /** 501ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * Constructor for the source stage of a LongStream. 502ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * 503ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * @param source {@code Supplier<Spliterator>} describing the stream 504ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * source 505ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * @param sourceFlags the source flags for the stream source, described 506ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * in {@link StreamOpFlag} 507ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * @param parallel {@code true} if the pipeline is parallel 508ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin */ 509289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public Head(Supplier<? extends Spliterator<Long>> source, 510ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin int sourceFlags, boolean parallel) { 511ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin super(source, sourceFlags, parallel); 512ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 513ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 514ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin /** 515ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * Constructor for the source stage of a LongStream. 516ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * 517ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * @param source {@code Spliterator} describing the stream source 518ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * @param sourceFlags the source flags for the stream source, described 519ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * in {@link StreamOpFlag} 520ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * @param parallel {@code true} if the pipeline is parallel 521ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin */ 522289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public Head(Spliterator<Long> source, 523ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin int sourceFlags, boolean parallel) { 524ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin super(source, sourceFlags, parallel); 525ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 526ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 527ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 528289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public final boolean opIsStateful() { 529ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin throw new UnsupportedOperationException(); 530ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 531ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 532ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 533289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public final Sink<E_IN> opWrapSink(int flags, Sink<Long> sink) { 534ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin throw new UnsupportedOperationException(); 535ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 536ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 537ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin // Optimized sequential terminal operations for the head of the pipeline 538ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 539ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 540ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public void forEach(LongConsumer action) { 541ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin if (!isParallel()) { 542ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin adapt(sourceStageSpliterator()).forEachRemaining(action); 543ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } else { 544ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin super.forEach(action); 545ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 546ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 547ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 548ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 549ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin public void forEachOrdered(LongConsumer action) { 550ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin if (!isParallel()) { 551ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin adapt(sourceStageSpliterator()).forEachRemaining(action); 552ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } else { 553ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin super.forEachOrdered(action); 554ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 555ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 556ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 557ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 558ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin /** Base class for a stateless intermediate stage of a LongStream. 559ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * 560ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * @param type of elements in the upstream source 561ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * @since 1.8 562289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * @hide Visible for CTS testing only (OpenJDK8 tests). 563ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin */ 564289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public abstract static class StatelessOp<E_IN> extends LongPipeline<E_IN> { 565ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin /** 566ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * Construct a new LongStream by appending a stateless intermediate 567ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * operation to an existing stream. 568ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * @param upstream The upstream pipeline stage 569ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * @param inputShape The stream shape for the upstream pipeline stage 570ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * @param opFlags Operation flags for the new stage 571ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin */ 572289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public StatelessOp(AbstractPipeline<?, E_IN, ?> upstream, 573ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin StreamShape inputShape, 574ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin int opFlags) { 575ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin super(upstream, opFlags); 576ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin assert upstream.getOutputShape() == inputShape; 577ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 578ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 579ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 580289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public final boolean opIsStateful() { 581ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return false; 582ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 583ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 584ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 585ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin /** 586ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * Base class for a stateful intermediate stage of a LongStream. 587ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * 588ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * @param type of elements in the upstream source 589ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * @since 1.8 590289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * @hide Visible for CTS testing only (OpenJDK8 tests). 591ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin */ 592289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public abstract static class StatefulOp<E_IN> extends LongPipeline<E_IN> { 593ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin /** 594ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * Construct a new LongStream by appending a stateful intermediate 595ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * operation to an existing stream. 596ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * @param upstream The upstream pipeline stage 597ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * @param inputShape The stream shape for the upstream pipeline stage 598ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin * @param opFlags Operation flags for the new stage 599289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin * @hide Visible for CTS testing only (OpenJDK8 tests). 600ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin */ 601289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public StatefulOp(AbstractPipeline<?, E_IN, ?> upstream, 602ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin StreamShape inputShape, 603ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin int opFlags) { 604ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin super(upstream, opFlags); 605ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin assert upstream.getOutputShape() == inputShape; 606ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 607ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 608ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 609289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public final boolean opIsStateful() { 610ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin return true; 611ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 612ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin 613ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin @Override 614289e51c2258b001f2aa6d6e67b21be7bb65d5102Igor Murashkin public abstract <P_IN> Node<Long> opEvaluateParallel(PipelineHelper<Long> helper, 615ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin Spliterator<P_IN> spliterator, 616ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin IntFunction<Long[]> generator); 617ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin } 618ff18b5f136f92154f2e05217e3953d10f459e561Igor Murashkin} 619