JavaRush /Java блогу /Random-KY /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де бир ыкманы ишке ашыруунун эң сонун жолу бар.

Lambda туюнтмалары

Келгиле, Javaнын мурунку versionларындагы саптардын тизмесин иреттөөнүн жөнөкөй мисалы менен баштайлы:
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 компилятору аргумент түрлөрү жөнүндө билет, андыктан аларды өткөрүп жиберсеңиз да болот. Келгиле, ламбда туюнтмаларын тереңирээк изилдеп, аларды кантип колдонсо болорун түшүнөлү.

Функционалдык интерфейстер

Ламбда туюнтмалары 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;
    }
}
Андан кийин биз жаңы an objectтерди түзүү үчүн интерфейсти аныктайбыз:
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. ... Уландысы бар. Тилекке каршы, мен макаланын долбоорун сактоонун жолун таба алган жокмун, бул чындыгында кызык, котормо убактысы бүттү, ошондуктан мен аны кийинчерээк бүтүрөм. Англис тorн билген жана түшүнгөн ар бир адам үчүн - Original Article . Котормону оңдоо боюнча сунуштарыңыз болсо, сизге жеткorктүү түрдө жазыңыз. Менин Github аккаунтум
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION