1. введение
В операторах Java if-else мы можем выполнить определенное действие , когда выражение true , и альтернативу, когда оно false . В этом уроке мы узнаем о том, как изменить логику с помощью оператора not .
2. Оператор if-else
Давайте начнем с простого if-else оператора:
boolean isValid = true; if (isValid) { System.out.println("Valid"); } else { System.out.println("Invalid"); }
Что, если наша программа должна обрабатывать только отрицательный случай? Как бы мы переписали приведенный выше пример?
Один из вариантов-просто удалить код в блоке if :
boolean isValid = true; if (isValid) { } else { System.out.println("Invalid"); }
Однако пустой блок if выглядит так, как будто это может быть неполный код, и кажется многословным способом обработки только отрицательного условия. Вместо этого мы могли бы попробовать проверить, соответствует ли наше логическое выражение false :
boolean isValid = true; if (isValid == false) { System.out.println("Invalid"); }
Приведенная выше версия относительно проста для чтения, хотя это было бы сложнее сделать, если бы логическое выражение было более сложным. Однако у Java есть альтернатива для нас в виде оператора not :
boolean isValid = true; if (!isValid) { System.out.println("Invalid"); }
3. Оператор не
Оператор not – это логический оператор, представленный в Java символом ! символ. Это унарный оператор, который принимает логическое значение в качестве своего операнда. Оператор not работает путем инвертирования (или отрицания) значения своего операнда .
3.1. Применение оператора not к логическому значению
При применении к логическому значению оператор not преобразует true в false и false в true .
Например:
System.out.println(!true); // prints false System.out.println(!false); // prints true System.out.println(!!false); // prints false
3.2. Применение оператора not к логическому выражению
Поскольку not является унарным оператором, когда вы хотите не результат выражения, вам нужно заключить это выражение в скобки , чтобы получить правильный ответ. Сначала вычисляется выражение в скобках, а затем оператор not инвертирует его результат.
Например:
int count = 2; System.out.println(!(count > 2)); // prints true System.out.println(!(count <= 2)); // prints false
boolean x = true; boolean y = false; System.out.println(!(x && y)); // prints true System.out.println(!(x || y)); // prints false
Следует отметить, что при отрицании выражения вступают в действие законы Де Моргана. Другими словами, каждый член в выражении отрицается, а оператор отменяется. Это может помочь нам упростить более сложные для чтения выражения.
Например:
!(x && y) is same as !x || !y !(x || y) is same as !x && !y !(a < 3 && b == 10) is same as a >= 3 || b != 10
4. Некоторые Общие Подводные камни
Использование оператора not иногда может поставить под угрозу читаемость нашего кода. Негатив может быть труднее понять, чем позитив. Давайте рассмотрим несколько примеров.
4.1. Двойные негативы
Поскольку оператор not является оператором отрицания, его использование с переменными или функциями, имеющими отрицательное имя, может привести к трудночитаемому коду. Это похоже на естественные языки, где двойные отрицания часто считаются трудными для понимания.
Например:
if (product.isActive()) {...}
читается лучше, чем
if (!product.isNotActive()) {...}
Хотя наш API может не предоставлять метод isActive , мы можем создать его для удобства чтения.
4.2. Сложные Условия
Оператор not иногда может сделать и без того сложное выражение еще более трудным для чтения и понимания. Когда это происходит, мы можем упростить код, изменив условие или извлекая методы. Давайте рассмотрим некоторые примеры условий, усложняемых оператором not , и как мы можем упростить их, изменив условие:
if (!true) // Complex if (false) // Simplified if (!myDate.onOrAfter(anotherDate)) // Complex if (myDate.before(anotherDate)) // Simplified if (!(a >= b)) // Complex if (a < b) // Simplified if (!(count >= 10 || total >= 1000)) // Complex if (count < 10 && total < 1000) // Simplified
5. Заключение
В этой статье мы обсудили оператор not и то, как его можно использовать с логическими значениями, выражениями и в операторах if-else .
Мы также рассмотрели некоторые общие подводные камни, вызванные написанием выражений в обратном порядке, и как их исправить.
Как всегда, исходный код для примеров, используемых в этой статье, доступен на GitHub .