Java 返回布尔值的并行流,第一次失败或全部代码计算成功
好的,使用Java8,需要知道我下面的代码是否完成了我需要它完成的任务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
- 我有三种方法。每个执行一个操作并以布尔值形式返回成功或失败
- 我需要让这三个同时运行
- 如果任何一个返回一个
,第一个这样做将导致整个过程短路,并且主方法返回一个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,则
这会使整个主方法短路,还是会继续
直到所有三个都完成为止
它确实会短路,如中所述。它确实会短路,但对于由三个元素组成的流,在第一个元素返回时,并行流已经开始所有操作的可能性很高。因此,只有当所有项目都完成后,它才有可能回归。这是没办法的。或者,你有平行的,或者你没有…