Вы когда-нибудь сталкивались в программировании со сценарием, когда вам нужно проверить, все ли элементы в списке или потоке удовлетворяют определенному условию? Это распространенный шаблон кодирования, но что происходит, когда список пуст? Именно здесь в игру вступает концепция пустой истины.
Прежде чем мы углубимся в математическое определение, давайте начнем с практического примера в коде, чтобы понять, что такое пустая истина.
Представьте, что вам поручено проверить, все ли элементы в списке удовлетворяют определенному условию. Если да, вы выполняете определенное действие. Например, рассмотрим следующий фрагмент кода Java:
public static void main(String[] args) { // Example - 1, expected to do something if (allNumbersAreOdd(Arrays.asList(1, 3, 5))) { System.out.println("do something 1"); } // Example - 2, NOT expected to do anything because NOT all numbers are odd if (allNumbersAreOdd(Arrays.asList(1, 2, 3, 4, 5))) { System.out.println("do something 2"); } // Example - 3, NOT expected to do anything because list is empty so there is no odd number. /* This is the surprising element which is known as "Vacuous truth" and it will print "do something". * It is applicable to both allMatch(Predicate super T> predicate) * and noneMatch(Predicate super T> predicate) */ if (allNumbersAreOdd(Collections.emptyList())) { System.out.println("do something 3"); } } private static boolean allNumbersAreOdd(@Nonnull Listnumbers) { return numbers.stream().allMatch(integer -> integer % 2 != 0); }
Третий пример особенно интересен. Почему он возвращает «Все числа нечетные», когда список пуст?
Такое поведение является примером пустой истины. В математической логике истинным считается утверждение, утверждающее что-то обо всех элементах пустого множества. Это связано с тем, что в наборе нет элементов, противоречащих утверждению.
Согласно Википедии:
"Пустая истина — это утверждение, утверждающее, что все члены пустого множества обладают определенным свойством. Такие утверждения считаются истинными, поскольку в пустом множестве нет контрпримеров."
Другими словами, когда мы говорим: «Все элементы множества S обладают свойством P», и если S пусто, это утверждение бессмысленно верно, поскольку в S нет ни одного элемента, который потенциально мог бы нарушить свойство P
Понимание бессодержательной истины важно в программировании, поскольку оно может повлиять на логику и результаты вашего кода, особенно при работе с коллекциями, потоками или любыми сценариями, где ваш ввод потенциально может быть пустым.
Заключение
В следующий раз, когда вы будете писать функцию, проверяющую, все ли элементы списка или потока удовлетворяют условию, помните о концепции пустой истины. Это объясняет, почему ваш код может вести себя неожиданным образом, когда входные данные пусты. Знание этого может помочь вам писать более надежные и предсказуемые программы.
Если у вас есть требование, чтобы пустой список/поток не был оценен как true, вам следует рассмотреть возможность дополнительной проверки списка/потока.
private static boolean allNumbersAreOdd(@Nonnull Listnumbers) { return !numbers.isEmpty() && numbers.stream().allMatch(integer -> integer % 2 != 0); }
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3