【发布时间】:2019-07-31 18:43:48
【问题描述】:
我正在生成,比如说,以下范围:
IntStream.iterate(1, i -> 3*i)
如何将流限制为特定的元素值,例如100(不使用limit()计算元素)?
谢谢!
UPDATE函数可以是任意的
【问题讨论】:
-
@surendrapanday 增量函数只是一个例子
标签: java java-8 java-stream
我正在生成,比如说,以下范围:
IntStream.iterate(1, i -> 3*i)
如何将流限制为特定的元素值,例如100(不使用limit()计算元素)?
谢谢!
UPDATE函数可以是任意的
【问题讨论】:
标签: java java-8 java-stream
如果您还不能使用 Java 9,可以使用以下对三参数 IntStream.iterate 的重新实现:
public static IntStream iterate(int seed, IntPredicate hasNext, IntUnaryOperator next) {
Objects.requireNonNull(next); Objects.requireNonNull(hasNext);
return StreamSupport.intStream(
new Spliterators.AbstractIntSpliterator(
Long.MAX_VALUE, Spliterator.ORDERED|Spliterator.NONNULL) {
private IntUnaryOperator op = i -> { op = next; return i; };
private int value = seed;
@Override
public boolean tryAdvance(IntConsumer action) {
Objects.requireNonNull(action);
if(op == null) return false;
int t = op.applyAsInt(value);
if(!hasNext.test(t)) { op = null; return false; }
action.accept(value = t);
return true;
}
@Override
public void forEachRemaining(IntConsumer action) {
Objects.requireNonNull(action);
IntUnaryOperator first = op;
if(first == null) return;
op = null;
for(int t = first.applyAsInt(value); hasNext.test(t); t = next.applyAsInt(t))
action.accept(t);
}
}, false);
}
它的工作方式类似于 Java 9 的 IntStream.iterate,不同之处在于您必须更改要调用 static 方法的类(或修改 import static 语句):
iterate(1, i -> i < 100, i -> i*3).forEach(System.out::println);
1
3
9
27
81
【讨论】:
一种新方法
Stream<T> iterate(T seed,Predicate<? super T> hasNext,UnaryOperator<T> next)
在 Java-9 中引入。因此,从该版本开始,可以执行以下操作:
IntStream.iterate(1, i -> i < 100, i -> 3*i)
这将产生1 3 9 27 81
【讨论】:
hasNext
1 3 9 27 81
作为其他答案的补充,如果您已经可以使用java-9,则还有另一种可能使用Stream#takeWhile 以Predicate 作为参数。
在jshell 测试
jshell> IntStream.iterate(1, i -> 3 * i).takeWhile(i -> i < 100).toArray();
$3 ==> int[5] { 1, 3, 9, 27, 81 }
【讨论】:
IntStream.range(0, N).forEach(this::doSomething);
int[] arr = IntStream.range(start, end).toArray();
【讨论】: