Java: уменьшить против AnyMatch против содержит - PullRequest
6 голосов
/ 05 апреля 2019
 List<Boolean> results = new ArrayList<>();
 results.add(true);
 results.add(true);
 results.add(true);
 results.add(false);

 if (results.contains(false)) {
     System.out.println(false);
 } else {
     System.out.println(true);
 }

 System.out.println(results.stream().reduce((a, b) -> a && b).get());
 //System.out.println(!results.stream().anyMatch(a -> a == false));
 System.out.println(!results.stream().anyMatch(a -> !a));

ВЫХОД:
ложь
ложь
ложь

К вашему сведению, результаты являются результатом карты + сбор ОП

List<Job> jobs;
List<Boolean> results = job.stream().map(j -> j.ready()).collect(Collector.toList())

Если явыберите команду Reduce или AnyMatch, мне не нужно собирать результаты операции карты.

Из результатов, представляющих собой список логических значений, я просто хочу вернуть значение false, если есть хотя бы одно значение false.

Я могу сделать это с помощью Reduce или AnyMatch.Мне не нравится Optional от Reduce, и мне не нравится, что я должен отрицать anyMatch

Есть ли плюсы / минусы для использования либо?

Ответы [ 3 ]

6 голосов
/ 05 апреля 2019

Похоже, что единственная причина, по которой вы собираете логические значения в список, заключается в том, что вы можете проверить, являются ли некоторые из них false:

Если я выберу уменьшение или любое совпадение, я недолжен собрать результаты операции карты [...] Я просто хочу вернуть false, если есть хотя бы одно false.

Если это так, то вам определенно следует рассмотреть прямой потокподход:

return jobs.stream().allMatch(Job::ready);
1 голос
/ 05 апреля 2019

Вы спрашиваете плюсы / минусы. Contains самый быстрый и простой. Reduce является самым громоздким / сложным здесь. Но ваша задача очень проста, так ли это имеет значение? Может быть, лучшим ключом для выбора подходящего подхода будет: «Какой из них лучше читаемый, понятный и обслуживаемый?» Этот подход с чистым кодом обычно более важен при разработке программного обеспечения, чем поиск микросекунд во время выполнения или количества строк в исходном коде. Но с другой стороны, я бы сказал, что contains здесь лучший.

System.out.println(!results.contains(false));

Тогда ваш anyMatch(a -> !a) по сути тот же, что и contains, и я бы определенно предпочел его более reduce для этой конкретной задачи. Но, опять же, реальная разница очень мала, и я бы больше беспокоился о читаемости и понятности для будущего разработчика этого программного обеспечения.

0 голосов
/ 05 апреля 2019
 System.out.println(results.stream().reduce((a, b) -> a && b).get());

Это всегда будет возвращать false, поскольку список (results) имеет по крайней мере 1 false.

&& всегда проверяет, чтобы оба значения были истинными, чтобы передать его как true.

 System.out.println(!results.stream().anyMatch(a -> !a));

Stream anyMatch(Predicate predicate) возвращает, соответствуют ли какие-либо элементы этого потока ( результаты ) предоставленному предикату (a -> !a). Когда вы делаете !results, результат, наконец, станет ложным после начального true .

...