2016-05-10 7 views
1

Мне нужно применить оператор && (логический и) ко всем элементам в списке. Проблема заключается в следующем: в моем текущем решении мне нужно инициализировать переменную rowResult, и я думаю, что результат может стать недействительным из-за переменной, имеющей начальное значение.Как применить логический оператор ко всем элементам в Java

ArrayList<Boolean> results = new ArrayList<>(); 
for (i = 1; i < results.size(); i++) { 
    rowResult = rowResult && results.get(i); 
} 
+2

Ну, похоже, вы должны инициализировать его до «истины» перед циклом - в этом случае он будет оставаться истинным, если в списке нет никаких «ложных» значений. Это то, что вы хотите? Есть ли причина, по которой вы игнорируете первый элемент списка btw? (Я также предлагаю использовать расширенный цикл for ...) О, и вы можете оптимизировать это, остановив, как только вы нажмете значение «false». –

+1

"then rowResult может стать неправильным" << почему? Нейтральное значение для операции И является 'true' (' x AND true' никогда не меняет 'x'), поэтому инициализация его' true' должна делать трюк просто отлично. – CherryDT

+0

Thx вы, ребята @JonSkeet и @CherryDT, вот что я думаю об этом: if 'rowResult' - true, то в случае, если «results» имеет 3x «FALSE», «rowResult» будет «TRUE». И это неверно. Мне нужно FALSE || ЛОЖЬ || FALSE == FALSE' –

ответ

5

Как уже отмечалось Jon тарелочкам или CherryDT вы можете инициализировать rowResult с true. Тогда ваш код может выглядеть следующим образом:

boolean rowResult = true; 
for (Boolean el: list) { 
    rowResult = el && rowResult; 
} 

В случае хотелось бы использовать оператор OR - || начальное значение должно быть установлено в false и оператора ||.


В Java 8 можно применить метод Использовать reduce для потоков:

List<Boolean> list = new ArrayList<>(); 
boolean rowResult = list.stream().reduce((a,b)-> a && b).orElse(true); 

Последнее имеет то преимущество, что вы можете применить любой логический оператор вместо &&.

В примере с java 8 можно просто сменить оператора на, например, ||, чтобы применить OR. Значение в инструкции orElse предназначено только для случая, когда список пуст.

+0

, но что, если список содержит все ложные значения? rowResult должен быть false, но TRUE || ЛОЖЬ || ЛОЖЬ || ЛОЖЬ || ... == TRUE –

+2

В вашем исходном вопросе вы указали оператор 'AND' -' && 'not' OR' - '||'. Для 'OR' изменить начальное значение на' false' и на '||'. В примере с java 8 просто измените оператор. Значение в инструкции orElse относится только к случаю, когда список пуст. –

+0

спасибо! что я пропустил. –

4

В Java 8, вы можете использовать потоки:

boolean rowResult = results.stream().allMatch(b -> b); 

Перед Java 8, была гуава:

boolean rowResult = Iterables.all(results, new Predicate<Boolean>() { 
    @Override 
    public boolean apply(Boolean input) { 
     return input; 
    } 
}); 
+0

Просто обратите внимание, что по крайней мере версия pre java 8 уязвима для исключения NullPointerException. – Tom

+0

Удаление этой аннотации не позволяет избежать уязвимости: P. – Tom

+0

Я знаю, я не имел в виду это так: D. Я абсолютно согласен, код уязвим для NPE. Было просто ввести в заблуждение аннотацию. – Mifeet

Смежные вопросы