1. Вирази vs Команди
Усі команди в Java поділяються на дві категорії: команди (Statement) та вирази (Expression). Про команду зазвичай говорять, що вона виконується, а про вираз — що він обчислюється. Але це не головне.
Основна різниця між командою та виразом у тому, що у виразу є результат обчислення. І у цього результату, по-перше, є тип, а по-друге, цей результат можна кудись присвоїти або використати у якомусь іншому виразі.
Приклади:
| Код | Примітки |
|---|---|
int x; |
Команда |
(a < 10) |
Вираз, тип boolean |
i++; |
Вираз, тип збігається з типом змінної i |
x = 5; |
Вираз, тип збігається з типом змінної x |
І що це нам дає?
По-перше, ми можемо використовувати той факт, що дуже багато команд насправді є виразами (мають результат обчислення). Наприклад, такий код працюватиме:
| Код | Примітки |
|---|---|
|
|
По-друге, ми можемо ігнорувати результат обчислення виразу, якщо хочемо.
| Код | Код, де ми ігноруємо результат: |
|---|---|
|
|
Ігнорувати результат обчислення виразу потрібно, наприклад, якщо вираз окрім результату робить ще щось корисне, і нам ця дія важлива, а сам результат — ні.
2. Тернарний оператор

Цей лайфхак вже цікавіший за попередній. У Java є спеціальний тернарний (потрійний) оператор. Він чимось схожий на скорочений запис оператора if–else:
Умова ? Вираз1 : Вираз2;
Якщо умова істинна, то виконується вираз1, інакше виконується вираз2. Після умови йде знак питання, а два вирази розділені двокрапкою.
Основна відмінність тернарного оператора від оператора if-else у тому, що тернарний оператор є виразом, а отже, його результат можна чомусь присвоїти.
Наприклад, ми хочемо обчислити мінімум двох чисел. З використанням тернарного оператора цей код виглядатиме так:
int a = 2;
int b = 3;
int min = a < b ? a : b;
Або, припустимо, вам потрібно присвоїти змінній різні значення залежно від якоїсь умови. Як це зробити?
Перший варіант — скористатися оператором if-else:
int age = 25;
int money;
if (age > 30)
money = 100;
else
money = 50;
Другий варіант — використати тернарний оператор, тобто скорочений запис оператора if-else:
int age = 25;
int money = age > 30 ? 100 : 50;
Тож що краще використовувати: оператор if-else чи тернарний оператор? З точки зору швидкості виконання, особливої різниці немає. Тут швидше питання читабельності коду. І це дуже важливий момент: код повинен не тільки правильно працювати, але й легко читатися іншими програмістами.
Найпростіший критерій може бути таким: якщо код вміщується в один рядок — використовуйте тернарний оператор, якщо в один рядок він вже не вміщується — краще використовувати if-else.
3. Порівняння дійсних чисел
Як уже говорилося раніше, просто так порівнювати дійсні числа не можна: в процесі роботи з ними завжди можуть виникати несподівані ефекти через те, що частина значущих цифр відкидається.
Тому є перевірений часом підхід. Якщо два дійсні числа відрізняються на дуже маленьке значення, значить можна вважати їх рівними. Приклад:
double a = 1.000001;
double b = 1.000002;
if ( (b - a) < 0.0001 )
System.out.println("Числа рівні");
else
System.out.println("Числа не рівні");
Але це ще не все: різниця чисел цілком може виявитися від'ємним числом. Тому, щоб такий підхід працював, потрібно порівнювати не просто різницю чисел, а модуль різниці чисел: |a-b|
У Java є спеціальний метод для обчислення модуля числа — Math.abs():
int m = Math.abs(значення);
Тому виправлений варіант нашого прикладу вище виглядатиме ось так:
double a = 1.000001;
double b = 1.000002;
if ( Math.abs(b - a) < 0.0001 )
System.out.println("Числа рівні");
else
System.out.println("Числа не рівні");
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ