JavaRush /Java blogi /Random-UZ /Java 8. Sizga kerak bo'lgan hamma narsa

Java 8. Sizga kerak bo'lgan hamma narsa

Guruhda nashr etilgan

Java 8 qo'llanma

"Java hali ham tirik va odamlar buni tushunishni boshladilar."
Mening Java 8 bilan tanishuvimga xush kelibsiz. Ushbu maqola sizni Java 7 dan Java 8 ga qadar barcha yangi xususiyatlarni bosqichma-bosqich o'rganib chiqadi. Tez va oddiy kod misollari bilan biz standart interfeyslarni, usul havolalarini va qanday foydalanishni o'rganishimiz mumkin. Takrorlanuvchi izohlar . Maqolaning oxirida biz Stream API bilan tanishamiz.
Java 8. Sizga kerak bo'lgan narsa - 1
Keraksiz suhbat yo'q - faqat kod va sharhlar! Oldinga!

Interfeyslar uchun standart usullar

Java 8 ni qo'shish orqali interfeyslarga mavhum bo'lmagan usullarni (amalga oshirilgan) qo'shish imkonini beradi default. Bu xususiyat kengaytma usullari sifatida ham tanilgan . Quyida birinchi misol:
interface Formula {
    double calculate(int a);

    default double sqrt(int a) {
        return Math.sqrt(a);
    }
}
Mavhum usuldan tashqari calculate, interfeys Formulaham standart usulni belgilaydi sqrt. Ushbu interfeysni amalga oshiradigan sinflar faqat calculate. Standart usul sqrtqutidan tashqarida ishlatilishi mumkin.
Formula formula = new Formula() {
    @Override
    public double calculate(int a) {
        return sqrt(a * 100);
    }
};

formula.calculate(100);     // 100.0
formula.sqrt(16);           // 4.0
Interfeys Formulaanonim sinf sifatida amalga oshiriladi. Kod ortiqcha: amalga oshirish uchun 6 qator sqrt(a * 100). Keyingi bo'limda ko'rib chiqamiz, Java 8 da bitta usulni amalga oshirishning yanada chiroyli usuli mavjud.

Lambda ifodalari

Keling, Java-ning oldingi versiyalarida satrlar ro'yxatini tartiblashning oddiy misolidan boshlaylik:
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 usul Collections.sortro'yxatni va solishtirgichni ro'yxatni tartiblash tartibida qabul qiladi. Siz har doim anonim taqqoslash sinfini yaratishingiz va uni o'tkazishingiz mumkin. Anonim sinf yaratish o'rniga, Java 8 da siz qisqaroq shakl, lambda ifodasini yozishingiz mumkin.
Collections.sort(names, (String a, String b) -> {
    return b.compareTo(a);
});
Ko'rib turganingizdek, kod ancha qisqaroq va o'qish osonroq. Ammo buni yanada qisqaroq qilish mumkin:
Collections.sort(names, (String a, String b) -> b.compareTo(a));
Bir qatorli tana uchun siz {}so'zni o'tkazib yuborishingiz mumkin return. Ammo siz uni yanada qisqartirishingiz mumkin:
Collections.sort(names, (a, b) -> b.compareTo(a));
Java kompilyatori argument turlari haqida biladi, shuning uchun siz ularni ham o'tkazib yuborishingiz mumkin. Keling, lambda iboralarini chuqurroq o'rganib chiqamiz va ulardan qanday foydalanish mumkinligini tushunamiz.

Funktsional interfeyslar

Lambda ifodalari Java tipidagi tizimga qanday mos keladi? Har bir lambda interfeysda tasvirlangan turga mos keladi. Shuning uchun funktsional interfeys faqat bitta mavhum usulni o'z ichiga olishi kerak. Ushbu turdagi har bir lambda ifodasi ushbu mavhum usulga mos keladi. Standart usullar mavhum emasligi sababli, kerak bo'lganda funktsional interfeyslarda standart usullarni yaratishingiz mumkin. Agar ushbu interfeysda faqat bitta mavhum usul mavjud bo'lsa, biz ixtiyoriy interfeyslardan lambda ifodalari sifatida ham foydalanishimiz mumkin. @FucntionalInterfaceUshbu talablarga javob berish uchun siz izoh qo'shishingiz kerak . Kompilyator bu haqda biladi va agar siz bir nechta mavhum usullarni taqdim qilmoqchi bo'lsangiz, istisno qiladi. Misol:
@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
Esda tutingki, agar @FunctionalInterfaceizoh qoldirilsa, kod ham kompilyatsiya qilinadi.

Usul va konstruktorga havolalar

Yuqoridagi misolni usul havolalari yordamida ham kichikroq qilish mumkin:
Converter<String, Integer> converter = Integer::valueOf;
Integer converted = converter.convert("123");
System.out.println(converted);   // 123
Java 8 qo'shish orqali usul yoki konstruktorga havolalarni o'tkazish imkonini beradi ::. Yuqoridagi misol statik usulga qanday murojaat qilishimiz mumkinligini ko'rsatadi, ammo biz statik bo'lmagan usullarga ham murojaat qilishimiz mumkin:
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"
Keling, ::konstruktorlar bilan qanday ishlashini ko'rib chiqaylik. Boshlash uchun biz turli konstruktorlar bilan misol sinfini aniqlaymiz:
class Person {
    String firstName;
    String lastName;

    Person() {}

    Person(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
}
Keyinchalik, yangi ob'ektlarni yaratish uchun interfeysni aniqlaymiz:
interface PersonFactory<P extends Person> {
    P create(String firstName, String lastName);
}
::Yaratish zavodini amalga oshirish o'rniga, biz konstruktor yordami bilan barchasini birlashtiramiz :
PersonFactory<Person> personFactory = Person::new;
Person person = personFactory.create("Peter", "Parker");
orqali konstruktorga havola yaratdik Person::new. Java kompilyatori avtomatik ravishda usul imzosiga mos keladigan to'g'ri konstruktorni tanlaydi PersonFactory.create. ... Davomi bor. Afsuski, men maqolaning qoralamasini saqlashning yo'lini topa olmadim va bu juda g'alati va tarjima vaqti tugadi - shuning uchun uni keyinroq tugataman. Ingliz tilini biladigan va tushunadigan har bir kishi uchun - Original maqola . Agar tarjimani tuzatish bo'yicha takliflaringiz bo'lsa, sizda mavjud bo'lgan har qanday usulda yozing. Mening Github hisobim
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION