377 };
378 }
379
380 // Stateful intermediate operations from Stream
381
382 @Override
383 public final Stream<P_OUT> distinct() {
384 return DistinctOps.makeRef(this);
385 }
386
387 @Override
388 public final Stream<P_OUT> sorted() {
389 return SortedOps.makeRef(this);
390 }
391
392 @Override
393 public final Stream<P_OUT> sorted(Comparator<? super P_OUT> comparator) {
394 return SortedOps.makeRef(this, comparator);
395 }
396
397 private Stream<P_OUT> slice(long skip, long limit) {
398 return SliceOps.makeRef(this, skip, limit);
399 }
400
401 @Override
402 public final Stream<P_OUT> limit(long maxSize) {
403 if (maxSize < 0)
404 throw new IllegalArgumentException(Long.toString(maxSize));
405 return slice(0, maxSize);
406 }
407
408 @Override
409 public final Stream<P_OUT> substream(long startingOffset) {
410 if (startingOffset < 0)
411 throw new IllegalArgumentException(Long.toString(startingOffset));
412 if (startingOffset == 0)
413 return this;
414 else
415 return slice(startingOffset, -1);
416 }
417
418 @Override
419 public final Stream<P_OUT> substream(long startingOffset, long endingOffset) {
420 if (startingOffset < 0 || endingOffset < startingOffset)
421 throw new IllegalArgumentException(String.format("substream(%d, %d)", startingOffset, endingOffset));
422 return slice(startingOffset, endingOffset - startingOffset);
423 }
424
425 // Terminal operations from Stream
426
427 @Override
428 public void forEach(Consumer<? super P_OUT> action) {
429 evaluate(ForEachOps.makeRef(action, false));
430 }
431
432 @Override
433 public void forEachOrdered(Consumer<? super P_OUT> action) {
434 evaluate(ForEachOps.makeRef(action, true));
435 }
436
437 @Override
438 @SuppressWarnings("unchecked")
439 public final <A> A[] toArray(IntFunction<A[]> generator) {
440 // Since A has no relation to U (not possible to declare that A is an upper bound of U)
441 // there will be no static type checking.
442 // Therefore use a raw type and assume A == U rather than propagating the separation of A and U
|
377 };
378 }
379
380 // Stateful intermediate operations from Stream
381
382 @Override
383 public final Stream<P_OUT> distinct() {
384 return DistinctOps.makeRef(this);
385 }
386
387 @Override
388 public final Stream<P_OUT> sorted() {
389 return SortedOps.makeRef(this);
390 }
391
392 @Override
393 public final Stream<P_OUT> sorted(Comparator<? super P_OUT> comparator) {
394 return SortedOps.makeRef(this, comparator);
395 }
396
397 @Override
398 public final Stream<P_OUT> limit(long maxSize) {
399 if (maxSize < 0)
400 throw new IllegalArgumentException(Long.toString(maxSize));
401 return SliceOps.makeRef(this, 0, maxSize);
402 }
403
404 @Override
405 public final Stream<P_OUT> skip(long n) {
406 if (n < 0)
407 throw new IllegalArgumentException(Long.toString(n));
408 if (n == 0)
409 return this;
410 else
411 return SliceOps.makeRef(this, n, -1);
412 }
413
414 // Terminal operations from Stream
415
416 @Override
417 public void forEach(Consumer<? super P_OUT> action) {
418 evaluate(ForEachOps.makeRef(action, false));
419 }
420
421 @Override
422 public void forEachOrdered(Consumer<? super P_OUT> action) {
423 evaluate(ForEachOps.makeRef(action, true));
424 }
425
426 @Override
427 @SuppressWarnings("unchecked")
428 public final <A> A[] toArray(IntFunction<A[]> generator) {
429 // Since A has no relation to U (not possible to declare that A is an upper bound of U)
430 // there will be no static type checking.
431 // Therefore use a raw type and assume A == U rather than propagating the separation of A and U
|