java - 收集可选项目

标签 java java-8 guava collect

给定 Guava 不可变表,我需要处理所有单元格,并根据返回 Java 可选的映射器结果过滤掉一些单元格,

  immutbleTable.cellSet()
            .parallelStream()
                .map(cell -> processAndGetOptionalResult(cell))
                .filter(cell -> cell.isPresent())
                .map(cell -> cell.get())
                .collect(Collector.of(
                        ImmutableTable.Builder::new,
                        ImmutableTable.Builder::put,
                        (l, r) -> l.putAll(r.build()),
                        ImmutableTable.Builder<String,String,String>::build)
            );
    }

有没有更好的方法来实现这一目标?有没有办法可以删除“map(cell -> cell.get())”并通过累加器本身收集 cell.get() ?

最佳答案

除了使用方法引用之外:

immutbleTable.cellSet()
        .parallelStream()
            .map(this::processAndGetOptionalResult)
            .filter(Optional::isPresent)
            .map(Optional::get)
            .collect(Collector.of(
                    ImmutableTable.Builder::new,
                    ImmutableTable.Builder::put,
                    (l, r) -> l.putAll(r.build()),
                    ImmutableTable.Builder<String,String,String>::build)
        );
}

答案是 - 在当前(JDK 8)API 中没有更好的方法来实现这一点。在 JDK 9 中,Optional 将具有 .stream() 方法,该方法允许使用一个操作 - flatMap:

immutbleTable.cellSet()
        .parallelStream()
            .map(this::processAndGetOptionalResult)
            .flatMap(Optional::stream)
            .collect(Collector.of(
                    ImmutableTable.Builder::new,
                    ImmutableTable.Builder::put,
                    (l, r) -> l.putAll(r.build()),
                    ImmutableTable.Builder<String,String,String>::build)
        );
}

For more details see this answer .

关于java - 收集可选项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39563582/

相关文章:

java - 当 mvn install 神秘失败时 -

java - AssertJ:如何使用 compareTo 和 extracting() 断言 BigDecimals

java - 从类创建新对象时出现“找不到符号”错误?

interface - 接口(interface)中的 Java 8 : Spliterator, 迭代器、集合和 "default"实现(名为 spliterator 的重复方法)

java - 执行 parallelStream.forEach(..) 时 native java 代码中的 NullPointerException

JSON:序列化 Guava optional

java - Guava :值或空集的不可变集

java - 如何在 Java 中获取方法的所有可能调用者 - 如调用层次结构

java - 为什么 java 收集流对每个 getter 运行两次?

java - 为什么 guava 21.0 版本中的 Maps 不采用 java.util.function.Function 等作为参数?