indicesArrays.stream().flatMap(n -> n.indices).sorted().filter(x->
//filter x if its difference with its predecessor is less then 5;
)
有没有一种"自然"的方法对流进行这种依赖过滤?你会怎么做对?
这就是我会尝试的方式:
indicesArrays.stream().flatMap(n -> n.indices).sorted().filter(new Predicate<Integer>() {
Integer lastX = null;
@Override
public boolean test(Integer t) {
if (lastX == null) {
lastX = t;
return true;
}
final boolean include = t - lastX >= 5;
lastX = t;
return include;
}
});
但我不确定这是否是一个好方法,也不确定它是否总是有效......
在你的特定情况下和当时最新的 openjdk 版本(jdk+b132)中,将起作用,b但不建议这样做。因为您的indexArrays
很可能是Collection<SomeClassWithABoxedIntStreamField>
,其stream()
方法返回顺序流,因此不会产生干扰。
但是,如果indexArrays.stream()
返回并行流,则首先必须将其转换为具有Stream::sequential
的顺序流。处理该流可能会产生正确的结果。
无论如何,这种代码确实不推荐使用,并且可能与未来的Java版本不兼容,这也违反了合同。
PS:看看IntStream
和Stream::flatMapToInt
。他们可以擦除装箱和取消装箱整数值的成本。