有状态依赖过滤流

时间:2016-06-02 06:00:47

标签: java java-stream

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;
                }
            });

但是我不确定这是不是一个好的方法我也不确定它会一直有效......

1 个答案:

答案 0 :(得分:2)

在您的特定情况下以及当时最新的openjdk版本(jdk + b132),这将是有效的,但不建议这样做。由于您的indexArrays非常可能是Collection<SomeClassWithABoxedIntStreamField>,其stream()方法会返回顺序流,因此不会产生任何干扰。

但是,如果indexArrays.stream()返回并行流,则首先必须将其转换为Stream::sequential的顺序流。处理该流可能会给出正确的结果。

无论如何,这种代码确实不推荐,可能与未来的Java版本不兼容,它也违反了合同。

PS:看看IntStreamStream::flatMapToInt。他们可以擦除装箱和取消装箱整数值的费用。