1. İfadələr vs Operatorlar
Java-da bütün konstruksiyalar iki kateqoriyaya bölünür: operatorlar (Statement) və ifadələr (Expression). Operator haqqında adətən deyirlər ki, o icra olunur, ifadə haqqında isə — hesablanır. Amma bu, əsas deyil.
Operatorla ifadənin əsas fərqi ondadır ki, ifadənin hesablanma nəticəsi var. Bu nəticənin, birincisi, tipi var, ikincisi, bu nəticəni harasa mənimsətmək, yaxud başqa bir ifadədə istifadə etmək olar.
Nümunələr:
| Kod | Qeydlər |
|---|---|
|
Operator |
|
İfadə, tipi boolean |
|
İfadə, tipi i dəyişəninin tipi ilə eynidir |
|
İfadə, tipi x dəyişəninin tipi ilə eynidir |
Bəs bu bizə nə verir?
Birincisi, onu istifadə edə bilərik ki, çoxlu operatorlar əslində ifadədir (hesablanma nəticəsi var). Məsələn, belə kod işləyəcək:
int x, y, z;
x = y = z = 1; // x = (y = (z = 1));
İkincisi, istəsək, ifadənin hesablanma nəticəsini görməməzliyə vura bilərik.
console.nextLine(); // daxil etmənin nəticəsini gözardı edirik
İfadənin nəticəsini görməməzliyə vurmaq, məsələn, ifadə nəticədən əlavə hansısa faydalı əməli də edirsə və bizə məhz o əməl lazımdırsa, nəticə isə yoxdursa, gərək ola bilər.
2. Ternar operator
Bu hiylə əvvəlkindən daha maraqlıdır. Java-da xüsusi ternar (üçlü) operator var. O, if–else operatorunun qısa yazılışına bənzəyir:
Uslovie ? Vyrazhenie1 : Vyrazhenie2;
Əgər şərt doğrudursa, onda ifadə1 seçilir, əks halda ifadə2 seçilir. Şərtdən sonra sual işarəsi gəlir, iki ifadə isə iki nöqtə ilə ayrılır.
Ternar operatorun if-else operatorundan əsas fərqi ondadır ki, ternar operator ifadədir, deməli, onun nəticəsini nəyəsə mənimsətmək olar.
Məsələn, iki ədədin minimumunu hesablamaq istəyirik. Ternar operatorla bu kod belə görünəcək:
int a = 2;
int b = 3;
int min = a < b ? a : b;
Yaxud, deyək ki, hansısa şərtdən asılı olaraq dəyişənə müxtəlif dəyərlər mənimsətməlisiniz. Bunu necə etmək olar?
Variant 1 — if-else operatorundan istifadə etmək:
int age = 25;
int money;
if (age > 30)
money = 100;
else
money = 50;
Variant 2 — ternar operatordan istifadə etmək, yəni if-else operatorunun qısa forması:
int age = 25;
int money = age > 30 ? 100 : 50;
Bəs hansından istifadə etmək daha yaxşıdır: if-else operatorundan, yoxsa ternar operatorundan? İcra sürəti baxımından xüsusi fərq yoxdur. Bu daha çox kodun oxunaqlılığı məsələsidir. Və bu, çox vacib məqamdır: kod təkcə düzgün işləməməli, həm də digər proqramçılar tərəfindən asan oxunmalıdır.
Ən sadə meyar belə ola bilər: kod bir sətrə sığırsa — ternar operatorundan istifadə edin, bir sətrə sığmırsa — if-else istifadə etmək daha yaxşıdır.
3. Nüanslar
Dəyər tipləri
Vacibdir: ternar operatorun hər iki budağındakı (<dəyər_doğru_olanda> və <dəyər_yanlış_olanda>) ifadələr eyni tipdə olmalı, ya da uyğun olmalıdır (məsələn, hər ikisi String və ya hər ikisi int).
İşləyir:
int a = 10, b = 20;
int max = (a > b) ? a : b; // hər iki budaq — int
Kompilyasiya xətası:
int a = 10, b = 20;
// String və int uyğun deyil
String result = (a > b) ? "böyüktur" : 0; // Kompilyasiya xətası: int dəyərini String tipli dəyişənə mənimsətmək olmaz
Düzgün variant:
int a = 10, b = 20;
String result = (a > b) ? "böyüktur" : "kiçik və ya bərabərdir";
Nümunə: ədədlərlə işləmə
Ternar operatorla modul dəyəri hesablayaq:
int number = -5;
int abs = (number >= 0) ? number : -number;
System.out.println(abs); // 5
4. Tətbiqdə ternar operatorun istifadəsi
Gəlin kiçik dialoq tətbiqi yazaq: salamlamadan əlavə, proqram istifadəçiyə bir ildən sonra neçə yaşı olacağını deyəcək və onun yetkin olub-olmayacağını göstərəcək.
System.out.print("Adınızı daxil edin: ");
String name = console.nextLine();
System.out.print("Yaşınızı daxil edin: ");
int age = console.nextInt();
int nextYear = age + 1;
String status = (nextYear >= 18) ? "yetkinlik yaşına çatmış" : "yetkinlik yaşına çatmamış";
System.out.println("Salam, " + name + "! Gələn il sizin " + nextYear + " yaşınız olacaq. Siz " + status + " olacaqsınız.");
Detalları izah edək:
status dəyişəni ternar operatorla hesablanır: əgər yaş gələn il 18-dən az deyilsə, deməli, istifadəçi yetkinlik yaşına çatmış olacaq (ya da elə qalacaq).
5. Daxili ternar operatorlar — ehtiyatlı olun!
Ternar operatoru bir-birinin içinə yerləşdirmək olar (hər budaqda başqa bir ternar ola bilər). Amma… bu adətən baş ağrısı yaradır, xüsusilə də kodu sizdən sonra oxuyacaq şəxs üçün (hətta bu, 2 gün sonra özünüz olsanız belə).
Nümunə: yaşa görə kateqoriyanın təyini
String category = (age < 7) ? "məktəbəqədər" :
(age < 18) ? "məktəbli" :
(age < 65) ? "böyük" : "pensioner";
Qərar cədvəli:
| Yaş | Şərt | Nəticə |
|---|---|---|
| < 7 | |
məktəbəqədər |
| 7–17 | |
məktəbli |
| 18–64 | |
böyük |
| 65 və daha çox | əks halda | pensioner |
Belə kodu hələ oxumaq olar, amma məntiq daha mürəkkəbdirsə — if-else if-else istifadə etmək daha yaxşıdır.
6. Lifehack: ternar operator və boolean tipi
Bəzən belə bir ifadə yazmaq lazım olur:
boolean adult = (age >= 18) ? true : false;
Amma bu, artıqdır. (age >= 18) ifadəsinin özü artıq boolean qaytarır. Ona görə də onu belə qısaltmaq olar:
boolean adult = (age >= 18);
GO TO FULL VERSION