Рубрики
Без рубрики

Использование оператора Not в условиях If в Java

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

Автор оригинала: baeldung.

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 .