java - 将 IntStream.iterate 限制为特定值
问题描述
比如说,我正在生成以下范围:
IntStream.iterate(1, i -> 3*i)
如何将流限制为特定的元素值,例如 100(不使用 limit() 计算元素)?
谢谢!
UPDATE函数可以是任意的
解决方案
如果您还不能使用 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
推荐阅读
- mysql - MySql 为什么要花很长时间来排序结果包括 SELECT IF() as Alice
- html - 您如何使用或
从 Wordpress Classic Blocks(页面编辑器)中使用 - android - 如何在 Android Studio 上的每台设备上使视图大小相同
- sql - 多个 UNION 可能更好的 SQL 查询 - 获取不同“键”名称的最新 5 条记录
- spring-cloud-stream - Spring Cloud Stream 和 Spring RetryTemplate 处理嵌套异常
- javascript - 无法使用 discord.js 获得角色
- git - 如何删除 .git 的大包文件?
- java - 如何查找重复的数组列表对象并将少数字段与唯一键合并
- java - MapStruct 映射不相关的相似类
- java - 查找字符串中打开的闭合 html 标记的数量