Dmi*_*ich 4 java java-8 java-stream
我说,我正在生成以下范围:
IntStream.iterate(1, i -> 3*i)
Run Code Online (Sandbox Code Playgroud)
如何将流限制为特定元素值,例如100(不是元素计数带限制())?
谢谢!
UPDATE函数可以是任意的
如果您还不能使用Java 9,则可以使用以下三个arg的重新实现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);
}
Run Code Online (Sandbox Code Playgroud)
它类似于Java 9 IntStream.iterate,除了你必须改变你正在调用static方法的类(或调整import static语句):
iterate(1, i -> i < 100, i -> i*3).forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
1
3
9
27
81
Run Code Online (Sandbox Code Playgroud)
一种新方法
Stream<T> iterate?(T seed,Predicate<? super T> hasNext,UnaryOperator<T> next)
Run Code Online (Sandbox Code Playgroud)
在Java-9中引入.所以从该版本开始可以做到这样的事情:
IntStream.iterate(1, i -> i < 100, i -> 3*i)
Run Code Online (Sandbox Code Playgroud)
哪个会产生 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 }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
260 次 |
| 最近记录: |