【问题标题】:Parallel streams returning boolean that fail on first or succeed on all - code evaluation返回布尔值的并行流首先失败或全部成功 - 代码评估
【发布时间】:2020-02-01 02:24:50
【问题描述】:

好的,使用 Java 8,需要知道下面的代码是否符合我的要求。

  • 我有三种方法。每个都执行一个操作并以布尔值的形式返回成功或失败。
  • 我需要让所有三个同时运行。
  • 如果有任何返回false,第一个这样做会导致整个进程短路,主方法返回false
  • 如果它们都没有返回false,则所有三个都需要运行完成并返回true,以便主方法返回true

我的代码:

private boolean checkProcess1(){
    //does stuff, mostly DB schema checking
}

private boolean checkProcess2(){
    //does stuff, mostly queries on a different DB
}

private boolean checkProcess3(){
    //does stuff, checking files and versioning
}

public boolean checkProcessesForSuccess(){
    final List<Supplier<Boolean>> checkList = Arrays.asList(
        this::checkProcess1,
        this::checkProcess2,
        this::checkProcess3
    );
    return checkList.parallelStream().allMatch( Supplier :: get );
}

我的主要症结在于.allMatch()。它应该采用一个谓词来确定如何评估列表中的每个项目。通过传入Supplier :: get,它是否不会在任何完整匹配集(例如所有false 值)上返回true,还是要求所有值都是true为了返回true?

另外,如果第一个返回结果的方法是false,这会短路整个主方法,还是继续处理直到三个都完成?我担心的是,如果一个短期运行的方法返回一个false,整个系统将被最长运行的方法绑定。

我有 previously tried to utilize CompletableFuture 来解决这个问题,我确实想出了一个解决方案,但它有点复杂,而且 - 老实说 - 非常不优雅和丑陋。我求助于 Streams,试图看看这个问题是否可以以更简单、更优雅的方式解决。

建议?

【问题讨论】:

    标签: java java-8 parallel-processing java-stream


    【解决方案1】:

    通过传入供应商::get,它不会在任何情况下返回true 全套匹配,例如所有错误值,还是需要所有 值是否为真才能返回真?

    它要求所有supplier.get 都返回true 才能最终从checkProcessesForSuccess 返回true 作为完整结果。

    另外,如果第一个返回结果的方法是假的, 这使整个主方法短路,还是继续 处理直到所有三个都完成?

    javadoc 中所述,它确实会短路。

    【讨论】:

    • 它确实短路了,但是对于三个元素的流,并行流在第一个返回时已经开始所有操作的可能性很高。所以它可能只有在所有这些都完成后才会返回。没有办法解决这个问题。要么让它们平行,要么没有……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 2017-05-24
    • 2016-05-03
    • 1970-01-01
    • 2013-11-07
    • 2022-06-11
    • 1970-01-01
    相关资源
    最近更新 更多