У меня есть куча предикатов, и я хочу связать их вместе логическим «и», чтобы конечный результат был истинным, только если все отдельные предикаты оцениваются как истинные.
Как я понимаю, есть два способа написать это. Я могу связать их вместе следующим образом:
Predicate composedPredicate =
predicate1
.and(predicate2)
.and(predicate3)
.and(predicate4)
Или я могу использовать более вложенный подход:
Predicate composedPredicate =
predicate1
.and(predicate2
.and(predicate3
.and(predicate4)))
Очевидно, что вариант 1 более удобочитаем, но кажется, что он может быть немного менее эффективным. Я предполагаю, что вариант 1 примерно эквивалентен: (((p1 && p2) && p3) && p4)
В то время как вариант 2 будет: (p1 && (p2 && (p3 && p4)))
Во втором случае будет оцениваться первый аргумент p1
, и если он окажется ложным, все сразу замкнется, и все готово. В первом варианте первым аргументом фактически является целое выражение ((p1 && p2) && p3)
, которое само имеет первый аргумент (p1 && p2)
, который, в свою очередь, имеет p1
в качестве первого аргумента. По сути, вы делаете еще 2 «шага» вверх по стеку, прежде чем p1 действительно может быть оценен. На самом деле я не знаю, как Java реализует методы предикатов по умолчанию, поэтому поправьте меня, если я ошибаюсь.
Есть ли способ получить лучшее из обоих миров? Если нет, должен ли я предпочесть более читаемый подход тому, что, вероятно, является очень незначительным увеличением производительности или наоборот?