«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Помните о «бессмысленной истине» при кодировании с помощью API java.util.stream.

Помните о «бессмысленной истине» при кодировании с помощью API java.util.stream.

Опубликовано 8 ноября 2024 г.
Просматривать:430

Keep \

  • Введение
  • Что такое Пустая Истина?
    • Постановка задачи
    • Введите пустую истину
      • Математическое определение пустой истины
    • Почему это важно в программировании?
    • Отзывы

Введение

Вы когда-нибудь сталкивались в программировании со сценарием, когда вам нужно проверить, все ли элементы в списке или потоке удовлетворяют определенному условию? Это распространенный шаблон кодирования, но что происходит, когда список пуст? Именно здесь в игру вступает концепция пустой истины.

Что такое Пустая Истина?

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

Постановка задачи

Представьте, что вам поручено проверить, все ли элементы в списке удовлетворяют определенному условию. Если да, вы выполняете определенное действие. Например, рассмотрим следующий фрагмент кода 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 List numbers) {
    return numbers.stream().allMatch(integer -> integer % 2 != 0);
  }

Третий пример особенно интересен. Почему он возвращает «Все числа нечетные», когда список пуст?

Введите пустую истину

Такое поведение является примером пустой истины. В математической логике истинным считается утверждение, утверждающее что-то обо всех элементах пустого множества. Это связано с тем, что в наборе нет элементов, противоречащих утверждению.

Математическое определение пустой истины

Согласно Википедии:

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

Другими словами, когда мы говорим: «Все элементы множества S обладают свойством P», и если S пусто, это утверждение бессмысленно верно, поскольку в S нет ни одного элемента, который потенциально мог бы нарушить свойство P

Почему это важно в программировании?

Понимание бессодержательной истины важно в программировании, поскольку оно может повлиять на логику и результаты вашего кода, особенно при работе с коллекциями, потоками или любыми сценариями, где ваш ввод потенциально может быть пустым.

Заключение
В следующий раз, когда вы будете писать функцию, проверяющую, все ли элементы списка или потока удовлетворяют условию, помните о концепции пустой истины. Это объясняет, почему ваш код может вести себя неожиданным образом, когда входные данные пусты. Знание этого может помочь вам писать более надежные и предсказуемые программы.
Если у вас есть требование, чтобы пустой список/поток не был оценен как true, вам следует рассмотреть возможность дополнительной проверки списка/потока.

  private static boolean allNumbersAreOdd(@Nonnull List numbers) {
    return !numbers.isEmpty() && numbers.stream().allMatch(integer -> integer % 2 != 0);
  }

Ссылки

  • Википедия: пустая правда
  • Примечание API в документации Java:
    • логическое значение allMatch(Predicate super T> предикат)
    • логическое значение noneMatch(Predicate super T> predicate)
Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/prabhatkjena/keep-vacuous-truth-on-top-of-mind- while-coding-with-javautilstream-api-4lnb?1 Если есть какие-либо нарушения, пожалуйста, свяжитесь с Study_golang@163 .comdelete
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3