Java 8 Dərslik
“Java hələ də yaşayır və insanlar bunu anlamağa başlayır”.
Java 8-ə girişimə xoş gəlmisiniz. Bu məqalə sizi Java 7-dən Java 8-ə qədər bütün yeni funksiyalar vasitəsilə addım-addım aparacaq. Tez və sadə kod nümunələri ilə biz Defolt İnterfeyslərdən, Metod istinadlarından və
necə istifadə
etməyi öyrənə bilərik. Təkrarlanan qeydlər . Məqalənin sonunda Stream API ilə tanış olacağıq.
Lazımsız söhbətlər yoxdur - sadəcə kod və şərhlər! İrəli!
İnterfeyslər üçün Defolt Metodlar
Java 8 bizə interfeyslərə
default
.
Bu xüsusiyyət Genişləndirmə Metodları kimi də tanınır . Aşağıda ilk nümunə:
interface Formula {
double calculate(int a);
default double sqrt(int a) {
return Math.sqrt(a);
}
}
Mücərrəd metoddan əlavə
calculate
, interfeys
Formula
standart metodu da müəyyən edir
sqrt
. Bu interfeysi həyata keçirən siniflər yalnız
calculate
. Standart metod
sqrt
qutudan kənarda istifadə edilə bilər.
Formula formula = new Formula() {
@Override
public double calculate(int a) {
return sqrt(a * 100);
}
};
formula.calculate(100);
formula.sqrt(16);
İnterfeys
Formula
anonim sinif kimi həyata keçirilir. Kod lazımsızdır: həyata keçirmək üçün 6 sətir
sqrt(a * 100)
. Növbəti hissədə görəcəyimiz kimi, Java 8-də vahid metodu tətbiq etməyin daha gözəl bir yolu var.
Lambda ifadələri
Java-nın əvvəlki versiyalarında sətirlərin siyahısını çeşidləmək üçün sadə bir nümunə ilə başlayaq:
List<String> names = Arrays.asList("peter", "anna", "mike", "xenia");
Collections.sort(names, new Comparator<String>() {
@Override
public int compare(String a, String b) {
return b.compareTo(a);
}
});
Statik metod
Collections.sort
siyahının çeşidlənməsi üçün siyahı və müqayisəçini qəbul edir. Siz həmişə anonim müqayisə sinfi yarada və onu ötürə bilərsiniz. Anonim sinif yaratmaq əvəzinə, Java 8-də daha qısa forma, lambda ifadəsi yaza bilərsiniz.
Collections.sort(names, (String a, String b) -> {
return b.compareTo(a);
});
Gördüyünüz kimi kod daha qısadır və oxunması daha asandır. Ancaq bunu daha da qısaltmaq olar:
Collections.sort(names, (String a, String b) -> b.compareTo(a));
{}
Bir sətirli bədən üçün sözü atlaya bilərsiniz
return
. Ancaq onu daha da qısalda bilərsiniz:
Collections.sort(names, (a, b) -> b.compareTo(a));
Java tərtibçisi arqument növləri haqqında bilir, ona görə də siz onları atlaya bilərsiniz. Lambda ifadələrini daha dərindən öyrənək və onların necə istifadə oluna biləcəyini anlayaq.
Funksional interfeyslər
Lambda ifadələri Java tipli sistemə necə uyğun gəlir? Hər bir lambda interfeysdə təsvir edilən bir növə uyğundur. Buna görə də, funksional interfeys yalnız bir mücərrəd metoddan ibarət olmalıdır. Bu tip hər bir lambda ifadəsi bu mücərrəd metoda uyğun olacaq. Defolt üsullar mücərrəd olmadığı üçün siz lazım olduqda funksional interfeyslərdə standart metodlar yaratmaqda sərbəstsiniz. Bu interfeysdə yalnız bir mücərrəd metod varsa, ixtiyari interfeyslərdən də lambda ifadələri kimi istifadə edə bilərik.
@FucntionalInterface
Bu tələblərə cavab vermək üçün annotasiya əlavə etməlisiniz . Kompilyator bunu bilir və birdən çox mücərrəd metod təqdim etmək istəsəniz, istisna atacaq. Misal:
@FunctionalInterface
interface Converter<F, T> {
T convert(F from);
}
Converter<String, Integer> converter = (from) -> Integer.valueOf(from);
Integer converted = converter.convert("123");
System.out.println(converted);
Unutmayın ki,
@FunctionalInterface
annotasiya buraxılarsa, kod da tərtib ediləcək.
Metod və Konstruktor İstinadları
Yuxarıdakı nümunə metod istinadlarından istifadə etməklə daha da kiçikləşdirilə bilər:
Converter<String, Integer> converter = Integer::valueOf;
Integer converted = converter.convert("123");
System.out.println(converted);
Java 8 əlavə etməklə metod və ya konstruktora istinadlar ötürməyə imkan verir
::
. Yuxarıdakı nümunə statik metoda necə istinad edə biləcəyimizi göstərir, baxmayaraq ki, biz qeyri-statik metodlara da istinad edə bilərik:
class Something {
String startsWith(String s) {
return String.valueOf(s.charAt(0));
}
}
Something something = new Something();
Converter<String, String> converter = something::startsWith;
String converted = converter.convert("Java");
System.out.println(converted);
::
Gəlin onun konstruktorlarla necə işlədiyinə baxaq . Başlamaq üçün müxtəlif konstruktorları olan bir nümunə sinfi təyin edəcəyik:
class Person {
String firstName;
String lastName;
Person() {}
Person(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}
Sonra, yeni obyektlər yaratmaq üçün interfeys təyin edəcəyik:
interface PersonFactory<P extends Person> {
P create(String firstName, String lastName);
}
::
Yaratma fabriki həyata keçirmək əvəzinə, biz konstruktor köməyi ilə hamısını birləşdirəcəyik :
PersonFactory<Person> personFactory = Person::new;
Person person = personFactory.create("Peter", "Parker");
vasitəsilə konstruktora keçid yaratdıq
Person::new
. Java kompilyatoru avtomatik olaraq metod imzasına uyğun olan düzgün konstruktoru seçəcək
PersonFactory.create
. ... Ardı var. Təəssüf ki, məqalənin qaralamasını saxlamaq üçün bir yol tapmadım və bu, həqiqətən qəribədir və tərcümə vaxtı bitdi - ona görə də sonra bitirəcəyəm. İngilis dilini bilən və anlayan hər kəs üçün -
Orijinal məqalə . Tərcüməni düzəltmək üçün təklifləriniz varsa, əlinizdə olan hər hansı bir şəkildə yazın.
Mənim Github hesabım
GO TO FULL VERSION