JavaRush /Java блогы /Random-KK /Java 8. Сізге қажет нәрсенің бәрі
Roman Beekeeper
Деңгей

Java 8. Сізге қажет нәрсенің бәрі

Топта жарияланған

Java 8 оқулығы

«Java әлі тірі және адамдар оны түсіне бастады».
Менің Java 8-ге кіріспеге қош келдіңіз. Бұл мақала сізге Java 7-ден Java 8-ге дейінгі барлық жаңа мүмкіндіктерді кезең-кезеңімен көрсетеді. Жылдам және қарапайым code мысалдары арқылы біз Әдепкі интерфейстерді, әдіс сілтемелерін және пайдалануды үйренеміз . Қайталанатын annotationлар . Мақаланың соңында біз Stream API-мен танысамыз.
Java 8. Сізге тек 1 қажет
Қажетсіз әңгіме жоқ - тек 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);     // 100.0
formula.sqrt(16);           // 4.0
Интерфейс 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);    // 123
@FunctionalInterfaceЕгер annotation алынып тасталса , codeтың да құрастырылатынын есте сақтаңыз .

Әдіс және конструктор сілтемелері

Жоғарыдағы мысалды әдіс сілтемелерін пайдалану арқылы да кішірейтуге болады:
Converter<String, Integer> converter = Integer::valueOf;
Integer converted = converter.convert("123");
System.out.println(converted);   // 123
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);    // "J"
::Оның конструкторлармен қалай жұмыс істейтінін көрейік . Бастау үшін біз әртүрлі конструкторлары бар мысал класын анықтаймыз:
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 тіркелгісі
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION