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.
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
Formula
ham standart usulni belgilaydi
sqrt
. Ushbu interfeysni amalga oshiradigan sinflar faqat
calculate
. Standart usul
sqrt
qutidan tashqarida ishlatilishi mumkin.
Formula formula = new Formula() {
@Override
public double calculate(int a) {
return sqrt(a * 100);
}
};
formula.calculate(100);
formula.sqrt(16);
Interfeys
Formula
anonim 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.sort
ro'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.
@FucntionalInterface
Ushbu 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);
Esda tutingki, agar
@FunctionalInterface
izoh 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);
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);
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
GO TO FULL VERSION