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;
}
});
但是我不确定这是不是一个好的方法我也不确定它会一直有效......
答案 0 :(得分:2)
在您的特定情况下以及当时最新的openjdk版本(jdk + b132),这将是有效的,但不建议这样做。由于您的indexArrays
非常可能是Collection<SomeClassWithABoxedIntStreamField>
,其stream()
方法会返回顺序流,因此不会产生任何干扰。
但是,如果indexArrays.stream()
返回并行流,则首先必须将其转换为Stream::sequential
的顺序流。处理该流可能会给出正确的结果。
无论如何,这种代码确实不推荐,可能与未来的Java版本不兼容,它也违反了合同。
PS:看看IntStream
和Stream::flatMapToInt
。他们可以擦除装箱和取消装箱整数值的费用。