JavaRush /Блоги Java /Random-TG /Java 8. Ҳама чизест, ки ба шумо лозим аст
Roman Beekeeper
Сатҳи

Java 8. Ҳама чизест, ки ба шумо лозим аст

Дар гурӯҳ нашр шудааст

Дастури Java 8

"Ява ҳанӯз зинда аст ва одамон онро дарк мекунанд."
Хуш омадед ба муаррифии ман ба Java 8. Ин мақола шуморо зина ба зина тамоми хусусиятҳои навро аз Java 7 то Java 8 меомӯзад . Бо мисолҳои codeи зуд ва оддӣ, мо метавонем тарзи истифодаи интерфейсҳои пешфарз, истинодҳои методӣ ва Эзоҳҳои такроршаванда . Дар охири мақола мо бо 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 вуҷуд дорад.

Ифодаҳои Ламбда

Биёед бо як мисоли оддии ҷудо кардани рӯйхати сатрҳо дар versionҳои қаблии 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);
});
Тавре ки шумо мебинед, рамз хеле кӯтоҳтар ва хондан осонтар аст. Аммо ин метавонад боз ҳам кӯтоҳтар карда шавад:
Collections.sort(names, (String a, String b) -> b.compareTo(a));
Барои бадан дорои як сатр, шумо метавонед {}калимаро гузаред return. Аммо шумо метавонед онро боз ҳам кӯтоҳтар кунед:
Collections.sort(names, (a, b) -> b.compareTo(a));
Тартибдиҳандаи Java дар бораи намудҳои аргументҳо медонад, бинобар ин шумо метавонед онҳоро низ гузаред. Биёед ба ибораҳои лямбда амиқтар кобед ва бифаҳмем, ки онҳо чӣ гуна истифода мешаванд.

Интерфейсҳои функсионалӣ

Чӣ тавр ифодаҳои лямбда ба системаи навъи Java мувофиқат мекунанд? Ҳар як ламбда ба навъи дар интерфейс тавсифшуда мувофиқат мекунад. Аз ин рӯ, интерфейси функсионалӣ бояд танҳо як усули абстрактӣ дошта бошад. Ҳар як ифодаи ламбдаи ин навъи ба ин усули абстрактӣ мувофиқат мекунад. Азбаски усулҳои пешфарз абстрактӣ нестанд, шумо метавонед усулҳои пешфарзро дар интерфейсҳои функсионалӣ ҳангоми зарурат эҷод кунед. Мо инчунин метавонем интерфейсҳои ихтиёриро ҳамчун ифодаи лямбда истифода барем, агар дар ин интерфейс танҳо як усули абстрактӣ мавҷуд бошад. Барои қонеъ кардани ин талабот, шумо бояд @FucntionalInterfaceэзоҳро илова кунед. Компилятор дар ин бора медонад ва агар шумо хоҳед, ки зиёда аз як усули абстрактӣ пешниҳод кунед, истисно мегузорад. Мисол:
@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
Дар хотир доред, ки code инчунин дар сурати @FunctionalInterfaceпартофта шудани эзоҳ тартиб дода мешавад.

Усул ва истинод ба конструктор

Намунаи дар боло овардашударо бо истифода аз истинодҳои методӣ ҳатто хурдтар кардан мумкин аст:
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. ... Давом дорад. Мутаассифона, ман роҳи захира кардани лоиҳаи мақоларо наёфтам ва ин воқеан аҷиб аст ва вақти тарҷума ба охир расидааст - бинобар ин ман онро дертар анҷом медиҳам. Барои ҳар касе, ки забони англисиро медонад ва мефаҳмад - Мақолаи аслӣ . Агар шумо барои ислоҳи тарҷума пешниҳоде дошта бошед, бо ҳар роҳе, ки ба шумо дастрас аст, нависед. Ҳисоби ман Github
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION