JavaRush /Java Blog /Random-TK /Java 8. Size zerur zatlaryň hemmesi

Java 8. Size zerur zatlaryň hemmesi

Toparda çap edildi

Java 8 Tutorial

"Java henizem diridir we adamlar muňa düşünip başlaýarlar."
Java 8 bilen tanyşlygymyza hoş geldiňiz. Bu makala size Java 7-den Java 8-e çenli ähli täze aýratynlyklary ädimme-ädim öwrener we çalt we ýönekeý kod mysallary bilen, default interfeýsleri, usul salgylanmalaryny we nädip ulanmalydygyny öwrenip bileris. Gaýtalanýan düşündirişler . Makalanyň ahyrynda “Stream API” bilen tanyşarys.
Java 8. Size gerek zat 1
Gereksiz söhbetdeşlik ýok - diňe kod we teswirler! Öňe!

Interfeýsler üçin esasy usullar

Java 8, goşmak arkaly interfeýslere abstrakt däl usullary (durmuşa geçirilýär) goşmaga mümkinçilik berýär default. Bu aýratynlyk giňeltmek usullary hökmünde hem bellidir . Aşakda ilkinji mysal:
interface Formula {
    double calculate(int a);

    default double sqrt(int a) {
        return Math.sqrt(a);
    }
}
Abstrakt usuldan başga-da calculate, interfeýs Formuladeslapky usuly kesgitleýär sqrt. Bu interfeýsi durmuşa geçirýän synplar diňe durmuşa geçirmeli calculate. Adaty usul sqrtgutydan ulanylyp bilner.
Formula formula = new Formula() {
    @Override
    public double calculate(int a) {
        return sqrt(a * 100);
    }
};

formula.calculate(100);     // 100.0
formula.sqrt(16);           // 4.0
Interfeýs Formulaanonim synp hökmünde amala aşyrylýar. Kod gerek däl: durmuşa geçirmek üçin 6 setir sqrt(a * 100). Indiki bölümde görşümiz ýaly, Java 8-de ýekeje usuly durmuşa geçirmegiň has owadan usuly bar.

Lambda aňlatmalary

Java-yň öňki wersiýalarynda setirleriň sanawyny tertipleşdirmegiň ýönekeý mysalyndan başlalyň:
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.sortsanawyň tertibi boýunça sanawy we deňeşdirijini kabul edýär. Elmydama anonim deňeşdiriji synp döredip, ony geçip bilersiňiz. Anonim synp döretmegiň ýerine Java 8-de has gysga bellik, lambda aňlatmasy döredip bilersiňiz.
Collections.sort(names, (String a, String b) -> {
    return b.compareTo(a);
});
Görşüňiz ýaly kod has gysga we okamak aňsat. Emma muny has gysga edip bolar:
Collections.sort(names, (String a, String b) -> b.compareTo(a));
{}Bir setirli beden üçin sözden geçip bilersiňiz return. Emma muny has gysga edip bilersiňiz:
Collections.sort(names, (a, b) -> b.compareTo(a));
Java düzüjisi argumentleriň görnüşleri barada bilýär, şonuň üçin olary hem geçirip bilersiňiz. Lambda aňlatmalaryna has çuňňur göz aýlalyň we olaryň ulanylyşyna düşüneliň.

Funksiýa interfeýsleri

Lambda aňlatmalary Java görnüş ulgamyna nädip laýyk gelýär? Her lambda interfeýsde beýan edilen görnüşe gabat gelýär. Şonuň üçin işleýän interfeýsde diňe bir abstrakt usul bolmaly. Bu görnüşiň her lambda aňlatmasy bu abstrakt usula laýyk gelýär. Dymmaklyk usullar abstrakt däldigi sebäpli, zerur bolanda funksional interfeýslerde başlangyç usullary döredip bilersiňiz. Şeýle hem bu interfeýsde diňe bir abstrakt usul bar bolsa, lambda aňlatmalary hökmünde özbaşdak interfeýsleri ulanyp bileris. @FucntionalInterfaceBu talaplary ýerine ýetirmek üçin düşündiriş goşmaly . Düzediji bu barada bilýär we birden köp abstrakt usul bilen üpjün etmek isleseňiz kadadan çykma atar. Mysal:
@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
@FunctionalInterfaceBellik ýok bolsa koduň hem düzüljekdigini ýadyňyzdan çykarmaň .

Usul we konstruktor salgylanmalary

Aboveokardaky mysal, usul salgylanmalaryny ulanyp hasam kiçeldilip bilner:
Converter<String, Integer> converter = Integer::valueOf;
Integer converted = converter.convert("123");
System.out.println(converted);   // 123
Java 8 goşmak arkaly bir usula ýa-da konstruktora salgylanmalary geçirmäge mümkinçilik berýär ::. Aboveokardaky mysal, statiki däl usullara nädip salgylanyp biljekdigimizi görkezýär, emma statik däl usullara hem salgylanyp bileris:
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"
::Gurluşykçylar bilen nähili işleýändigini göreliň . Başlamak üçin, dürli konstruktorlar bilen mysal synpyny kesgitläris:
class Person {
    String firstName;
    String lastName;

    Person() {}

    Person(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
}
Indiki, täze obýektleri döretmek üçin interfeýsi kesgitläris:
interface PersonFactory<P extends Person> {
    P create(String firstName, String lastName);
}
::Dörediş zawodyny durmuşa geçirmegiň ýerine, hemmesini konstruktor kömegi bilen birleşdireris :
PersonFactory<Person> personFactory = Person::new;
Person person = personFactory.create("Peter", "Parker");
Konstruktor bilen baglanyşyk döretdik Person::new. Java düzüjisi usul goluna gabat gelýän dogry konstruktory awtomatiki saýlar PersonFactory.create. ... Dowam etmek. Gynansagam, makalanyň eserini ýatda saklamagyň usulyny tapmadym, bu hakykatdanam geň, terjime wagty gutardy - şonuň üçin soňrak gutararyn. Iňlis dilini bilýän we düşünýänleriň hemmesi üçin - Asyl makala . Terjimäni düzetmek üçin teklipleriňiz bar bolsa, elýeterli görnüşde ýazyň. Github hasabym
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION