JavaRush /Java Blogu /Random-AZ /Java 8. Sizə lazım olan hər şey
Roman Beekeeper
Səviyyə

Java 8. Sizə lazım olan hər şey

Qrupda dərc edilmişdir

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.
Java 8. Sizə lazım olan tək şey 1
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 Formulastandart metodu da müəyyən edir sqrt. Bu interfeysi həyata keçirən siniflər yalnız calculate. Standart metod sqrtqutudan kənarda istifadə edilə bilər.
Formula formula = new Formula() {
    @Override
    public double calculate(int a) {
        return sqrt(a * 100);
    }
};

formula.calculate(100);     // 100.0
formula.sqrt(16);           // 4.0
İnterfeys Formulaanonim 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.sortsiyahı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. @FucntionalInterfaceBu 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);    // 123
Unutmayın ki, @FunctionalInterfaceannotasiya 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);   // 123
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);    // "J"
::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
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION