Java 8 оқулығы
«Java әлі тірі және адамдар оны түсіне бастады».
Менің Java 8-ге кіріспеге қош келдіңіз. Бұл мақала сізге Java 7-ден Java 8-ге дейінгі барлық жаңа мүмкіндіктерді кезең-кезеңімен көрсетеді. Жылдам және қарапайым code мысалдары арқылы біз Әдепкі интерфейстерді, әдіс сілтемелерін
және пайдалануды үйренеміз .
Қайталанатын annotationлар . Мақаланың соңында біз Stream API-мен танысамыз.
Қажетсіз әңгіме жоқ - тек code пен түсініктемелер! Алға!
Интерфейстерге арналған әдепкі әдістер
Java 8 интерфейстерін қосу арқылы дерексіз емес әдістерді (орындалатын) қосуға мүмкіндік береді
default
.
Бұл мүмкіндік кеңейту әдістері ретінде де белгілі . Төменде бірінші мысал келтірілген:
interface Formula {
double calculate(int a);
default double sqrt(int a) {
return Math.sqrt(a);
}
}
calculate
Интерфейс дерексіз әдіспен қатар
Formula
әдепкі әдісті де анықтайды
sqrt
. Бұл интерфейсті жүзеге асыратын сыныптар тек
calculate
. Әдепкі әдісті
sqrt
қораптан тыс пайдалануға болады.
Formula formula = new Formula() {
@Override
public double calculate(int a) {
return sqrt(a * 100);
}
};
formula.calculate(100);
formula.sqrt(16);
Интерфейс
Formula
анонимді класс ретінде жүзеге асырылады. Код артық: іске асыру үшін 6 жол
sqrt(a * 100)
. Келесі бөлімде көретініміздей, Java 8-де бір әдісті жүзеге асырудың жақсы жолы бар.
Ламбда өрнектері
Java-ның алдыңғы нұсқаларындағы жолдар тізімін сұрыптаудың қарапайым мысалынан бастайық:
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);
}
});
Статикалық әдіс
Collections.sort
тізімді және компараторды тізім сұрыпталатын ретпен қабылдайды. Сіз әрқашан анонимді компаратор класын жасай аласыз және оны жібере аласыз. Анонимді класс жасаудың орнына Java 8-де қысқарақ пішінді, лямбда өрнегін жазуға болады.
Collections.sort(names, (String a, String b) -> {
return b.compareTo(a);
});
Көріп отырғаныңыздай, code әлдеқайда қысқа және оқуға оңай. Бірақ бұл одан да қысқа болуы мүмкін:
Collections.sort(names, (String a, String b) -> b.compareTo(a));
Бір жолдан тұратын дене үшін
{}
сөзді өткізіп жіберуге болады
return
. Бірақ сіз оны қысқарта аласыз:
Collections.sort(names, (a, b) -> b.compareTo(a));
Java компиляторы аргумент түрлері туралы біледі, сондықтан оларды өткізіп жіберуге болады. Ламбда өрнектерін тереңірек зерттеп, оларды қалай қолдануға болатынын түсінейік.
Функционалдық интерфейстер
Lambda өрнектері Java типті жүйеге қалай сәйкес келеді? Әрбір ламбда интерфейсте сипатталған түрге сәйкес келеді. Сондықтан функционалды интерфейс тек бір дерексіз әдісті қамтуы керек. Осы түрдегі әрбір ламбда өрнегі осы дерексіз әдіске сәйкес болады. Әдепкі әдістер дерексіз болмағандықтан, қажет болған жағдайда функционалдық интерфейстерде әдепкі әдістерді жасай аласыз. Бұл интерфейсте тек бір дерексіз әдіс болса, біз ерікті интерфейстерді ламбда өрнектері ретінде де пайдалана аламыз.
@FucntionalInterface
Бұл талаптарды орындау үшін annotation қосу керек . Компилятор бұл туралы біледі және бірнеше дерексіз әдісті ұсынғыңыз келсе, ерекше жағдайды шығарады. Мысалы:
@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);
@FunctionalInterface
Егер annotation алынып тасталса , codeтың да құрастырылатынын есте сақтаңыз .
Әдіс және конструктор сілтемелері
Жоғарыдағы мысалды әдіс сілтемелерін пайдалану арқылы да кішірейтуге болады:
Converter<String, Integer> converter = Integer::valueOf;
Integer converted = converter.convert("123");
System.out.println(converted);
Java 8 қосу арқылы әдіске немесе конструкторға сілтемелерді беруге мүмкіндік береді
::
. Жоғарыдағы мысал статикалық әдіске қалай сілтеме жасай алатынымызды көрсетеді, бірақ біз статикалық емес әдістерге де сілтеме жасай аламыз:
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);
::
Оның конструкторлармен қалай жұмыс істейтінін көрейік . Бастау үшін біз әртүрлі конструкторлары бар мысал класын анықтаймыз:
class Person {
String firstName;
String lastName;
Person() {}
Person(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}
Содан кейін біз жаңа нысандарды құру үшін интерфейсті анықтаймыз:
interface PersonFactory<P extends Person> {
P create(String firstName, String lastName);
}
::
Жасау фабрикасын енгізудің орнына, біз оның барлығын конструктор көмегі арқылы байланыстырамыз :
PersonFactory<Person> personFactory = Person::new;
Person person = personFactory.create("Peter", "Parker");
арқылы конструкторға сілтеме жасадық
Person::new
. Java компиляторы әдіс қолтаңбасына сәйкес келетін дұрыс конструкторды автоматты түрде таңдайды
PersonFactory.create
. ... Жалғасы бар. Өкінішке орай, мен мақаланың жобасын сақтаудың жолын таппадым, бұл өте таңқаларлық және аударма уақыты аяқталды, сондықтан мен оны кейінірек аяқтаймын. Ағылшын тілін білетін және түсінетін әрбір адам үшін -
Original Article . Аударманы түзету бойынша ұсыныстарыңыз болса, өзіңізге қолжетімді кез келген жолмен жазыңыз.
Менің Github тіркелгісі
GO TO FULL VERSION