有状态依赖 筛选流


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:看看IntStreamStream::flatMapToInt。他们可以擦除装箱和取消装箱整数值的成本。

最新更新