1. Изрази срещу твърдения

В Java е полезно да се прави разлика между две категории: изрази и изрази . За израз обикновено се казва, че е изпълнен , докато за израз се казва, че е оценен . Но не това е най-важното.

Основната разлика между твърдение и израз е, че оценяването на израз има резултат . И този резултат има тип и може да бъде присвоен на променлива or използван в няHowъв друг израз.

Примери:

Код Бележки
int x; Изявление
(a < 10) Израз, чийто тип еboolean
i++; Израз, чийто тип е същият като типа на iпроменливата
x = 5; Израз, чийто тип е същият като типа на xпроменливата

И Howво ни дава това?

Първо, можем да се възползваме от факта, че много твърдения всъщност са изрази (което означава, че оценяват стойност). Например code като този ще работи:

Код Бележки
int x, y, z;
x = y = z = 1;
int x, y, z;
x = (y = (z = 1))

Второ, ако искаме, можем да игнорираме резултата от изчисляването на израз.

Код Код, при който игнорираме резултата:
int x = scanner.nextInt();
boolean m = (5 < 10);
scanner.nextInt();
(5 < 10);

Ние игнорираме резултата от оценяването на израз, например, ако изразът включва извършване на нещо полезно и това действие е важно за нас, а не самият резултат.


2. Тернарен оператор

Този лайфхак вече е по-интересен от предишния. Java има специален троичен оператор . Синтаксисът му е донякъде подобен на синтаксиса на if-elseизраза:

Condition ? Expression 1 : Expression 2;

Ако conditionто е вярно, тогава се оценява израз 1 , в противен случай се оценява израз 2 . Условието е последвано от въпросителен знак и двата израза са разделени с двоеточие .

Основната разлика между троичния оператор и if-elseоператора е, че троичният оператор е израз, което означава, че можем да присвоим неговия резултат на нещо.

Да предположим например, че искаме да изчислим минимума от две числа. Използвайки троичния оператор, този code ще изглежда така:

int a = 2;
int b = 3;
int min = a < b ?  a : b;

Или, да кажем, че трябва да присвоите различни стойности на променлива в зависимост от няHowво condition. Как правиш това?

Единият вариант е да използвате 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оператор or троичния оператор ? По отношение на скоростта на изпълнение няма голяма разлика. Това е по-скоро въпрос на четливост на codeа. И това е много важен момент: codeът трябва не само да работи правилно, но и да бъде лесен за четене от други програмисти.

Най-простото правило е следното: ако codeът се побира на един ред , използвайте троичния оператор ; но ако не се побира на един ред, тогава е по-добре да използвате if-elseизраз.



3. Сравняване на реални числа

Както споменахме по-рано, не можете просто да вземете реални числа и да ги сравните. Винаги има възможност някои значими цифри да бъдат изхвърлени, причинявайки неочаквани странични ефекти.

Ето защо има изпитан във времето подход. Ако две реални числа се различават с много малка стойност, тогава те могат да се считат за равни. Пример:

double a = 1.000001;
double b = 1.000002;
if ( (b - a) < 0.0001 )
   System.out.println("The numbers are equal");
else
   System.out.println("The numbers are not equal");

Но това не е всичко, за което трябва да се тревожим, тъй като разликата между числата може да се окаже отрицателна. Така че, за да работи този подход, трябва да сравните не само разликата между числата, но и абсолютната стойност на разликата между числата:|a-b|

Java има метод за изчисляване на абсолютната стойност на число: Math.abs():

int m = Math.abs(value);

В резултат на това коригираната version на нашия пример по-горе ще изглежда така:

double a = 1.000001;
double b = 1.000002;

if ( Math.abs(b - a) < 0.0001 )
   System.out.println("The numbers are equal");
else
   System.out.println("The numbers are not equal");