Хорошо, работая с 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
, он не возвращает true
на любом полном наборе совпадений, таких как все значения false
, или требует, чтобы все значения были true
в порядке для возврата true
?
Кроме того, если первый метод, возвращающий результат, - false
, это приводит к короткому замыканию всего основного метода или продолжает обработку до тех пор, пока все три не будут завершены? Меня беспокоит то, что если кратковременный метод возвращает false
, вся система будет связана с самым продолжительным методом.
Я ранее пытался использовать CompletableFuture
для этой проблемы, и я действительно придумал решение, но оно было немного более сложным и - честно - довольно не элегантным и безобразным. Я обратился к Streams, пытаясь понять, можно ли решить проблему более простым и элегантным способом.
Предложения?