java - 状态依赖过滤流

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

但我不确定这是否是一个好方法,也不确定它总是有效......

最佳答案

在您的特定情况下以及当时最新的 openjdk 版本(jdk+b132),这将起作用,但不建议这样做。因为你的indexArrays很可能是Collection<SomeClassWithABoxedIntStreamField> ,其stream()方法返回一个顺序流,那么就不会产生干扰。

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

无论如何,这种代码确实不推荐,并且可能与 future 的Java版本不兼容,它也违反了约定。

PS:看看IntStreamStream::flatMapToInt 。他们可以消除装箱和拆箱整数值的成本。

关于java - 状态依赖过滤流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37583804/

相关文章:

java - 使用 lambda 和流表达代码块的简洁方法

java - 这个网格变量从哪里来?

java - 如何检查Graph是否连接

Java Web 应用程序,tomcat 6

java - 是否可以在 jsp 中根据条件设置页面内容类型或为单个 jsp 设置不同的内容类型

java - 无法解析导入 com.badlogic.gdx.graphics.gl10

java - 带有 Consumer 或 Filter 的 Java8 List 的条件,哪种方式更好

java - 当每个对象可以分为多个组时如何对对象进行分组?

java - 在流上使用 Collections.toMap() 时如何保持列表的迭代顺序?