Java 返回布尔值的并行流,第一次失败或全部代码计算成功

Java 返回布尔值的并行流,第一次失败或全部代码计算成功,java,java-8,parallel-processing,java-stream,Java,Java 8,Parallel Processing,Java Stream,好的,使用Java8,需要知道我下面的代码是否完成了我需要它完成的任务 我有三种方法。每个执行一个操作并以布尔值形式返回成功或失败 我需要让这三个同时运行 如果任何一个返回一个false,第一个这样做将导致整个过程短路,并且主方法返回一个false 如果它们都没有返回一个false,那么所有三个都需要运行到完成并返回一个true,以便主方法返回一个true 我的代码: private boolean checkProcess1(){ //does stuff, mostly DB s

好的,使用Java8,需要知道我下面的代码是否完成了我需要它完成的任务

  • 我有三种方法。每个执行一个操作并以布尔值形式返回成功或失败
  • 我需要让这三个同时运行
  • 如果任何一个返回一个
    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 );
}
private boolean checkProcess1(){
//做一些事情,主要是数据库模式检查
}
私有布尔checkProcess2(){
//做一些事情,主要是在不同的数据库上进行查询
}
私有布尔checkProcess3(){
//进行填充、检查文件和版本控制
}
public boolean checkProcessesForSuccess(){
最终列表检查表=Arrays.asList(
这个::checkProcess1,
这个::checkProcess2,
这个::checkProcess3
);
返回checkList.parallelStream().allMatch(Supplier::get);
}
我的主要症结在于
.allMatch()
。它应该使用一个谓词来确定如何计算列表中的每个项目。通过传入
Supplier::get
,它是否不会在任何完整的匹配集上返回
true
,例如所有
false
值,或者它是否要求所有值都
true
才能返回
true

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

我对这个问题已经有了一个解决方案,我确实想出了一个解决方案,但它要复杂得多,而且——老实说——相当不雅观和丑陋。我转向Streams,试图看看这个问题是否能以更简单、更优雅的方式得到解决

建议

通过传入Supplier::get,它不会在任何 完整的匹配集,例如所有假值,还是需要所有 值为true才能返回true

它需要所有
supplier.get
返回true,最终从
检查过程中返回true作为成功的完整结果

此外,如果返回结果的第一个方法为false,则 这会使整个主方法短路,还是会继续 直到所有三个都完成为止


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

它确实会短路,但对于由三个元素组成的流,在第一个元素返回时,并行流已经开始所有操作的可能性很高。因此,只有当所有项目都完成后,它才有可能回归。这是没办法的。或者,你有平行的,或者你没有…