JavaRush /Java Blog /Random-TK /8-den 13-e çenli: Java wersiýalaryna doly syn. 1-nji bölü...

8-den 13-e çenli: Java wersiýalaryna doly syn. 1-nji bölüm

Toparda çap edildi
Pişikler, hemmäňize salam)) Şeýlelik bilen, bu gün biz 2020-nji ýylda, Java 14 çykýança gaty az zat galdy. 17-nji martda taýýar wersiýa garaşmalysyňyz, hakykatdan soň ol ​​ýerde täze we gyzykly zatlary seljereris, ýöne şu gün Java-yň öňki wersiýalarynda ýadymy täzelemek isleýärin. Bize näme täzelik getirdiler? Geliň, göz aýlalyň. Synlary Java 8 bilen başlalyň, sebäbi ol henizem aktual we taslamalaryň köpüsinde ulanylýar. 8-den 13-e çenli: Java wersiýalaryna doly syn.  1-nji bölümOzal her 3-5 ýyldan täze wersiýalar çykýardy, ýöne ýakynda Oracle başgaça çemeleşdi - “her alty aýdan täze Java”. Şeýlelik bilen, her alty aýdan aýratynlyklaryň çykýandygyny görýäris. Gowy ýa-da erbet bolsun, her kim başgaça görýär. Mysal üçin, men muny gaty halamok, sebäbi täze wersiýalarynda täze aýratynlyklar ýok, ýöne şol bir wagtyň özünde, wersiýalar ýagyşdan soň kömelek ýaly ösýär. Java 8 bilen bir taslama birnäçe gezek göz aýladym we Java 16 eýýäm çykdy (ýöne seýrek çyksa, täze aýratynlyklar ýygnanýar we ahyrynda bu waka dynç alyş ýaly köpden bäri garaşylýar: hemmeler ara alyp maslahatlaşýarlar täze haýyrlar we siz ondan geçip bilmersiňiz). Geliň, başlalyň!

Java 8

Funksiýa interfeýsi

Bu näme? Funksiýa interfeýsi, ýerine ýetirilmedik (abstrakt) usuly öz içine alýan interfeýsdir. @FunctionalInterface , şeýle interfeýsiň üstünde ýerleşdirilen goşmaça düşündiriş. Funksiýa interfeýsiniň talaplaryna laýyk gelýändigini ýa-da ýokdugyny barlamaly (diňe bir abstrakt usuly bar). Alwaysöne hemişe bolşy ýaly, käbir gowaklarymyz bar: asyl we statiki usullar bu talaplara laýyk gelmeýär. Şonuň üçin şeýle usullaryň birnäçesi bolup biler + biri abstrakt we interfeýs işleýär. Şeýle hem, interfeýsiň işleýşine kesgitlemesine täsir etmeýän Obýekt synpynyň usullary bolup biler. Adaty we statiki usullar barada birnäçe söz goşaryn:
  1. Adaty üýtgediji bilen usullar, bar bolan ýerine ýetirişini bozman interfeýslere täze usullary goşmaga mümkinçilik berýär.

    public interface Something {
      default void someMethod {
          System.out.println("Some text......");
      }
    }

    Hawa, hawa, ýerine ýetirilen usuly interfeýsine goşýarys we bu usuly durmuşa geçireniňizde, ony ýok edip bilmersiňiz, miras galan usul hökmünde ulanyp bilersiňiz. Aöne bir synp berlen usul bilen iki interfeýsi amala aşyrsa, düzmekde ýalňyşlyk ýüze çykar we interfeýsleri ýerine ýetirip, belli bir usul bilen synpy miras alsa, ene synp usuly interfeýs usullarynyň üstüni ýapar we kadadan çykma işlemez.

  2. interfeýsdäki statiki usullar synpdaky statiki usullar ýaly işleýär. Forgetatdan çykarmaň: nesil synpyndan statiki usuly çagyryp bilşiňiz ýaly, statiki usullary miras alyp bilmersiňiz .

Şeýlelik bilen, funksional interfeýsler barada ýene birnäçe söz we dowam edeliň. FI-leriň esasy sanawlary (galanlary olaryň görnüşleri):

    Predikat - argument hökmünde T bahasyny alýar, boolean gaýtaryp berýär.

    Mysal:boolean someMethod(T t);

  • Sarp ediji - T görnüşli argument alýar, hiç zat yzyna gaýtarmaýar (boş).

    Mysal:void someMethod(T t);

  • Üpjün ediji - giriş hökmünde hiç zat almaýar, ýöne T. bahasyny yzyna gaýtaryp berýär.

    Mysal:T someMethod();

  • Funksiýa - T görnüşiniň parametrini giriş hökmünde alýar, R görnüşiniň bahasyny yzyna gaýtaryp berýär.

    Mysal:R someMethod(T t);

  • UnaryOperator - T argumentini alýar we T görnüşiniň bahasyny yzyna berýär.

    Mysal:T someMethod(T t);

Akym

Akymlar, maglumat gurluşlaryny işleýiş stilinde dolandyrmagyň usulydyr. Adatça bu ýygyndylardyr (ýöne beýleki, has az duş gelýän ýagdaýlarda ulanyp bilersiňiz). Has düşnükli dilde, Akym, ähli maglumatlar bilen bir wagtyň özünde işleýän ýaly, her biri ýaly bolşy ýaly zalym güýç däl-de, işleýän maglumatlar akymydyr. Geliň, kiçijik bir meselä seredeliň. Süzmek isleýän (50-den az), 5-e köpeltmek we galanlardan ilkinji 4 belgini konsola çykarmak isleýän sanlarymyz bar diýeliň. Muny öň nädip ederdik:
List<Integer> list = Arrays.asList(46, 34, 24, 93, 91, 1, 34, 94);

int count = 0;

for (int x : list) {

  if (x >= 50) continue;

  x += 5;

  count++;

  if (count > 4) break;

  System.out.print(x);

}
Kod kän däl ýaly, logika eýýäm birneme bulaşyk. Akymyň ulanylyşyna seredeliň:
Stream.of(46, 34, 24, 93, 91, 1, 34, 94)

      .filter(x -> x < 50)

      .map(x -> x + 5)

      .limit(4)

      .forEach(System.out::print);
Akymlar, kod mukdaryny azaltmak we has okalmak arkaly durmuşy ep-esli aňsatlaşdyrýar. Bu mowzugy has jikme-jik öwrenmek isleýänler üçin bu ýerde gowy (hatda ajaýyp diýerdim) makala .

Lambda

Iň möhüm we köpden bäri garaşylýan aýratynlyk lambdalaryň peýda bolmagydyr. Lambda näme? Bu, dürli ýerlere geçirilip bilinjek kodlar toplumy, şonuň üçin zerur bolanda birnäçe gezek ýerine ýetirilip bilner. Örän bulaşyk ýaly görünýär, şeýlemi? Plyönekeý söz bilen aýdanyňda, lambdalary ulanyp, funksional interfeýs usulyny (näbelli synpy durmuşa geçirmegiň bir görnüşi) durmuşa geçirip bilersiňiz:
Runnable runnable = () -> { System.out.println("I'm running !");};

new Thread(runnable).start();
Run () usulyny çalt we gereksiz gyzyl lentasyz durmuşa geçirdik. Hawa: Işläp bolýan funksional interfeýs. Şeýle hem akymlar bilen işleýän wagtym lambdalary ulanýaryn (ýokardaky akymlar bilen mysallarda). Gaty çuňlaşmarys, sebäbi gaty çuňňur çümüp bilersiňiz, men henizem ýüregini gazýan ýigitler has çuňňur gazyp biler ýaly birnäçe baglanyşyk goýaryn:

her biri üçin

Java 8-de akym ýaly maglumat akymy bilen işleýän täze foreach bar. Ine bir mysal:
List<Integer> someList = Arrays.asList(1, 3, 5, 7, 9);

someList.forEach(x -> System.out.println(x));
(käbirList.stream () meňzeş. foreach (…))

Usul salgylanmasy

Salgylanma usullary, Java synplarynyň ýa-da obýektleriniň bar bolan usullaryna ýa-da konstruktorlaryna salgylanmak üçin döredilen täze, peýdaly sintaksisdir: Usul salgylanmalary dört görnüşde gelýär:
  1. Dizaýner bilen baglanyşyk:

    SomeObject obj = SomeObject::new

  2. Statiki usul salgylanmasy:

    SomeObject::someStaticMethod

  3. Belli bir görnüşdäki obýektiň statik däl usulyna salgylanma:

    SomeObject::someMethod

  4. Belli bir obýektiň yzygiderli (statik däl) usulyna salgylanma

    obj::someMethod

Köplenç usul salgylanmalary lambdalaryň ýerine akymlarda ulanylýar (salgylanma usullary lambdalardan has çalt, ýöne okamak mümkinçiliginden pes).
someList.stream()

        .map(String::toUpperCase)

      .forEach(System.out::println);
Salgylanma usullary barada has giňişleýin maglumat isleýänler üçin:

API wagty

Sene we wagt bilen işlemek üçin täze kitaphana bar - java.time. 8-den 13-e çenli: Java wersiýalaryna doly syn.  1-nji bölümTäze API islendik Joda-Time meňzeýär. Bu API-iň iň möhüm bölümleri:
  • “LocalDate” belli bir sene, mysal üçin - 2010-01-09;
  • LocalTime - wagt guşagyny göz öňünde tutýan wagt - 19:45:55 (LocalDate bilen meňzeş);
  • LocalDateTime - ýerliDate + LocalTime - 2020-01-04 15:37:47;
  • ZoneId - wagt guşaklygyny aňladýar;
  • Sagat - bu görnüşi ulanyp, häzirki wagta we senä girip bilersiňiz.
Ine, bu mowzukda hakykatdanam gyzykly makalalar:

Meýletin

Bu java.util paketindäki täze synp , gymmaty örtüji, hilesi hem howpsuz null bolup biler . Meýletin kabul etmek: “Optional.of”Optional<String> someOptional = Optional.of("Something"); -da null geçsek , iň halaýan “NullPointerException” alarys . Şeýle ýagdaýlar üçin ulanýarlar: - bu usuldan gorkmakdan gorkmaly dälsiňiz. Ondan soň, ilkibaşda boş dörediň Meýletin: Boşdygyny ýa-da ýokdugyny barlamak üçin ulanyň: bize dogry ýa-da ýalan gaýdyp geler. Gymmatlygy bar bolsa belli bir hereketi ýerine ýetiriň, gymmaty ýok bolsa hiç zat etmäň: Goşmaça boş bolsa, geçen bahany yzyna gaýtarýan ters usul (ätiýaçlyk meýilnamanyň görnüşi): Siz gaty uzak dowam edip bilersiňiz ( bagtymyza, islege görä iki jomart eli bilen usullar goşuldy), ýöne bu barada durup bilmeris. Başlaýanlar üçin iki baglanyşyk goýanym has gowudyr: Optional<String> someOptional = Optional.ofNullable("Something");Optional<String> someOptional = Optional.empty();someOptional.isPresent();someOptional.ifPresent(System.out::println);System.out.println(someOptional.orElse("Some default content")); Java 8-de iň meşhur täzeliklere geçdik - bu hemmesi däl. Has giňişleýin bilmek isleseňiz, men muny size goýdum:

Java 9

Şeýlelikde, 2017-nji ýylyň 21-nji sentýabrynda dünýä JDK 9-ny gördi. Bu Java 9 baý aýratynlyklar bilen üpjün edildi. Täze dil düşünjeleri ýok bolsa-da, täze API-ler we anyklaýyş buýruklary döredijiler üçin hökman gyzykly bolar. 8-den 13-e çenli: Java wersiýalaryna doly syn.  1-nji bölüm

JShell (REPL - okamak-baha bermek-çap etmek aýlawy)

Bu interaktiw konsolyň Java ýerine ýetirilişi, işleýşini barlamak we konsolda interfeýsler, synplar, sanlar, operatorlar we ş.m. ýaly dürli gurluşlary ulanmak üçin ulanylýar. JShell-i işe girizmek üçin diňe terminalda jshell ýazmaly. Soňra hyýalymyzyň rugsat berýän zadyny ýazyp bileris: 8-den 13-e çenli: Java wersiýalaryna doly syn.  1-nji bölümJShell ulanyp, ýokary derejeli usullary döredip, şol bir sessiýada ulanyp bilersiňiz. Usullar statiki usullar ýaly işlär, statiki açar sözden aýrylyp bilinmez. Java 9 REPL (JShell) gollanmasynda has köp okaň .

Hususy

Java-yň 9-njy wersiýasyndan başlap, interfeýslerde hususy usullary ulanmaga mümkinçiligimiz bar (deslapky we statiki usullar, elýeterliligiň ýeterlik däldigi sebäpli beýlekileri ýok edip bilmeris). private static void someMethod(){} try-with-resources “Resurs bilen synanyşmak” kadadan çykmalaryny dolandyrmak ukyby täzelendi:
BufferedReader reader = new BufferedReader(new FileReader("....."));
  try (reader2) {
  ....
}

Modullyk ( Jigsaw )

Modul, täze modul beýan ediji faýly bilen baglanyşykly paketleriň we çeşmeleriň toparydyr. Bu çemeleşme, kod birikdirmesini gowşatmak üçin ulanylýar. Boş birikdirme koduň dowamlylygy we giňelmegi üçin esasy faktor. Modullyk dürli derejelerde amala aşyrylýar:
  1. Programma dili.
  2. Wirtual maşyn.
  3. Standart java API.
JDK 9 92 modul bilen gelýär: olary ulanyp ýa-da özümiz döredip bileris. Has çuňňur gözlemek üçin birnäçe baglanyşyk:

Üýtgemeýän ýygyndy

Java 9-da kolleksiýany bir setir bilen döretmek we doldurmak mümkin boldy, üýtgewsiz etmek bilen (ozal üýtgewsiz kolleksiýa döretmek üçin kolleksiýa döretmeli, maglumatlar bilen doldurmaly we bir usul çagyrmaly, mysal üçin, Kolleksiýalar.unmodifiableList). Şeýle ýaradylyşyň mysaly: List someList = List.of("first","second","third");

Beýleki täzelikler:

  • giňeldilen Goşmaça (täze usullar goşuldy);
  • “ProcessHandle” we “ProcessHandle” interfeýsleri operasiýa ulgamynyň hereketlerine gözegçilik etmek üçin peýda boldy;
  • G1 - asyl hapa ýygnaýjy;
  • HTTP / 2 protokollaryny we WebSocket-i goldaýan HTTP müşderisi;
  • giňeldilen akym;
  • Reaktiw akymlar API çarçuwasy goşuldy (reaktiw programmirlemek üçin);
Java 9-a has doly çümdürmek üçin size okamagyňyzy maslahat berýärin:

Java 10

Şeýlelik bilen, Java 9 çykandan alty aý soň, 2018-nji ýylyň mart aýynda (düýnki ýaly ýadymda) Java 10 sahna çykdy. 8-den 13-e çenli: Java wersiýalaryna doly syn.  1-nji bölüm

var

Indi maglumat görnüşini bermeli däl. Habary var diýip belleýäris we düzüji habaryň görnüşini sag tarapdaky başlangyç görkezijiniň görnüşi boýunça kesgitleýär. Bu aýratynlyk diňe başlangyç bilen ýerli üýtgeýjiler üçin elýeterlidir: usuly kesgitlemek, başlangyç görnüşleri we ş.m. üçin ulanyp bolmaýar, sebäbi görnüşini kesgitläp biljek başlangyç ýok. Mysal var (setir görnüşi üçin):
var message = "Some message…..";
System.out.println(message);
var açar söz däl: aslynda int ýaly ätiýaçlandyrylan görnüş . Varyň peýdasy gaty uludyr: görnüşli beýannamalar hiç hili peýdasyz köp ünsi çekýär we bu aýratynlyk wagt tygşytlaýar. Sameöne şol bir wagtyň özünde, uzyn usullar zynjyryndan üýtgeýji alynsa, kod haýsy okaýar, sebäbi haýsy obýektiň bardygyny derrew belli däl. Bu funksiýa bilen has tanyş bolmak isleýänlere bagyşlanýar:

JIT düzüjisi (GraalVM)

Goşmaça sözlemän, javac buýrugyny işledeniňizde, Java programmasynyň Java kodundan JVM bytekodyna düzülendigini ýatladýaryn, bu programmanyň ikili görnüşi. Emma adaty kompýuter prosessory diňe JVM bytekodyny ýerine ýetirip bilmeýär. JVM programmaňyzyň işlemegi üçin prosessoryň eýýäm ulanyp bilýän maşyn koduna öwrülen bu bytekod üçin başga bir düzüjisi gerek. Javac bilen deňeşdirilende, bu düzüji has çylşyrymly, ýöne has ýokary hilli maşyn kody hem öndürýär. Häzirki wagtda OpenJDK- da HotSpot wirtual maşyny bar, bu bolsa öz gezeginde iki sany JIT düzüjisi bar. Birinjisi, C1 ( müşderi düzüjisi ) has ýokary tizlikli işlemek üçin niýetlenendir, ýöne kod optimizasiýasy ejir çekýär. Ikinjisi C2 (serwer düzüjisi). Executionerine ýetiriş tizligi ejir çekýär, ýöne kod has optimallaşdyrylýar. Haýsy haçan ulanylýar? C1 uzyn JIT arakesmeleri islenmeýän iş stoly programmalary üçin ajaýyp, we C2 uzak wagtlap işleýän serwer programmalary üçin ajaýyp, bu ýerde has köp wagt sarp etmek gaty kyn. Köp derejeli jemleme , ilkinji gezek C1-den geçende we netijesi C2-den geçende (has optimizasiýa üçin ulanylýar). GraalVM , HotSpot-ny doly çalyşmak üçin döredilen taslama. Graal bilen baglanyşykly birnäçe taslama hökmünde pikir edip bileris: HotSpot üçin täze JIT düzüjisi we täze poliglot wirtual maşyn. Bu JIT düzüjiniň aýratynlygy, Java-da ýazylmagydyr. Graal düzüjiniň artykmaçlygy howpsuzlyk, ýagny heläkçilik däl-de, kadadan çykmalar, ýadyň syzmagy däl. Şeýle hem, gowy IDE goldawymyz bolar we düzedişleri, profilleri ýa-da beýleki amatly gurallary ulanyp bileris. Mundan başga-da, düzüji HotSpot-dan garaşsyz bolup biler we has çalt JIT-düzülen wersiýasyny döredip biler. Gazýanlar üçin:

Parallel G1

G1 zibil ýygnaýjy gaty gowy, şübhesiz, ýöne onuň gowşak tarapy hem bar: bir sapakly doly GC siklini ýerine ýetirýär. Ulanylmaýan zatlary tapmak üçin toplap boljak enjamlaryň ähli güýjüne mätäç wagtyňyzda, diňe bir sapak bilen çäklenýäris. Bu Java 10-da düzedildi. Indi GC indi oňa goşýan ähli çeşmelerimiz bilen işleýär (ýagny köp sapakly bolýar). Muňa ýetmek üçin dil döredijiler GC üçin ajaýyp arassa interfeýs döredip, esasy çeşmeleriň GC-den izolýasiýasyny gowulandyrdylar. Bu açyklygy döredijiler, OpenJDK, diňe bir täze GC-leriň döredilmegini mümkin boldugyça ýönekeýleşdirmek bilen çäklenmän, ýygnamakdan gereksiz GC-leri çalt öçürmek üçin koddaky zibili ýörite arassalamaly boldular. Üstünligiň esasy ölçeglerinden biri, bu gowulaşmalardan soň iş tizliginiň peselmegi. Geliň, şeýle hem seredeliň: Beýleki täzelikler:
  1. Arassa zibil-kollektor interfeýsi hödürlenýär. Bu çeşme kodunyň dürli zibil ýygnaýjylardan izolýasiýasyny gowulandyrýar, alternatiw kollektorlary çalt we agyrsyz birleşdirmäge mümkinçilik berýär;
  2. JDK çeşmelerini bir ammarda birleşdirmek;
  3. Kolleksiýalar täze usul aldy - bu ýygyndynyň üýtgewsiz nusgasyny yzyna gaýtaryp berýän copyOf (Collection) ;
  4. Meýletin (we onuň görnüşleri) täze usuly bar .orElseThrow () ;
  5. Mundan beýläk, JVM-ler Docker konteýnerinde işleýändiklerine göz ýetirýärler we operasiýa ulgamynyň özüni soramak däl-de, konteýnerlere mahsus konfigurasiýany alarlar.
Java 10 bilen has giňişleýin tanyşmak üçin birnäçe materiallar: Java-yň käbir wersiýalarynyň 1.x diýip atlandyrylmagy meni gaty bulaşdyrýardy. Düşünmek isleýärin: 9-dan ozal Java wersiýalarynda başga at dakmak shemasy bardy. Mysal üçin, Java 8-i 1.8 , Java 5 - 1.5 we ş.m. diýip hem atlandyryp bolar. Indi bolsa, Java 9-dan çykanlara geçiş bilen at dakmagyň shemasynyň hem üýtgändigini we Java wersiýalarynyň indi 1.x bilen goşulmaýandygyny görýäris. . Bu birinji bölümiň soňy: java 8-10-yň täze gyzykly aýratynlyklaryna geçdik. Indiki ýazgydaky iň soňky zatlar bilen tanyşlygymyzy dowam etdireliň .
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION