JavaRush /Blog Jawa /Random-JV /Saka 8 nganti 13: ringkesan lengkap babagan versi Jawa. B...

Saka 8 nganti 13: ringkesan lengkap babagan versi Jawa. Bagean 1

Diterbitake ing grup
Anak kucing, halo kabeh)) Dadi, dina iki kita wis ing taun 2020, lan isih sithik nganti rilis Java 14. Sampeyan kudu nyana versi rampung ing Maret 17, kita bakal njelasno apa seger lan menarik ana sawise kasunyatan, nanging dina iki aku kaya kanggo refresh memori ing versi sadurungé saka Jawa. Apa anyar sing padha nggawa kita? Ayo dideleng. Ayo miwiti review karo Java 8, amarga isih cukup relevan lan digunakake ing umume proyek. Saka 8 nganti 13: ringkesan lengkap babagan versi Jawa.  Bagean 1 - 1Sadurunge, versi anyar dirilis saben 3-5 taun, nanging bubar Oracle njupuk pendekatan sing beda - "Jawa anyar saben nem sasi." Dadi, saben nem sasi kita ndeleng release fitur. Apa iku apik utawa ala, saben wong ndeleng iku beda. Contone, aku ora seneng banget, amarga versi anyar ora duwe akeh fitur anyar, nanging ing wektu sing padha, versi berkembang kaya jamur sawise udan. Aku kedhip kaping pirang-pirang ing proyek karo Java 8, lan Java 16 wis dirilis (nanging nalika metu arang banget, fitur-fitur anyar nglumpukake, lan pungkasane acara iki wis ditunggu-tunggu, kaya preian: kabeh wong ngrembug babagan barang anyar lan sampeyan ora bisa ngliwati). Dadi ayo miwiti!

Jawa 8

Antarmuka Fungsional

Apa iki? Antarmuka fungsional yaiku antarmuka sing ngemot siji metode (abstrak) sing ora ditindakake. @FunctionalInterface minangka anotasi opsional sing diselehake ing ndhuwur antarmuka kasebut. Perlu dipriksa manawa cocog karo syarat antarmuka fungsional (mung duwe siji cara abstrak). Nanging kaya biasane, kita duwe sawetara caveat: metode standar lan statis ora ana ing syarat kasebut. Mulane, bisa uga ana sawetara cara + siji abstrak, lan antarmuka bakal fungsional. Bisa uga ngemot metode kelas Obyek sing ora mengaruhi definisi antarmuka minangka fungsional. Aku bakal nambah sawetara tembung babagan cara standar lan statis:
  1. Metode kanthi modifier standar ngidini sampeyan nambahake metode anyar menyang antarmuka tanpa ngrusak implementasine sing wis ana.

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

    Ya, ya, kita nambahake metode sing diimplementasikake ing antarmuka, lan nalika ngetrapake metode iki, sampeyan ora bisa ngilangi, nanging digunakake minangka warisan. Nanging yen kelas ngleksanakake loro antarmuka karo cara diwenehi, kita bakal duwe kesalahan kompilasi, lan yen ngleksanakake antarmuka lan oleh warisan kelas karo cara podho rupo tartamtu, bakal cara kelas tuwane tumpang tindih cara antarmuka lan pangecualian ora bisa.

  2. cara statis ing antarmuka dianggo padha karo cara statis ing kelas. Aja lali: sampeyan ora bisa oleh warisan cara statis , kaya sampeyan ora bisa nelpon cara statis saka kelas turunan.

Dadi, sawetara tembung liyane babagan antarmuka fungsional lan ayo nerusake. Ing ngisor iki dhaptar utama FI (liyane minangka varietas):

    Predikat - njupuk sawetara nilai T minangka argumen, ngasilake boolean.

    Tuladha:boolean someMethod(T t);

  • Konsumen - njupuk argumentasi jinis T, ora ngasilake apa-apa (kosong).

    Tuladha:void someMethod(T t);

  • Supplier - ora njupuk apa-apa minangka input, nanging ngasilake sawetara nilai T.

    Tuladha:T someMethod();

  • Fungsi - njupuk parameter tipe T minangka input, ngasilake nilai tipe R.

    Tuladha:R someMethod(T t);

  • UnaryOperator - njupuk argumen T lan ngasilake nilai jinis T.

    Tuladha:T someMethod(T t);

Aliran

Aliran minangka cara kanggo nangani struktur data kanthi gaya fungsional. Biasane iki koleksi (nanging sampeyan bisa nggunakake ing liyane, kahanan kurang umum). Ing basa sing luwih bisa dingerteni, Stream minangka aliran data sing diproses kaya-kaya nggarap kabeh data ing wektu sing padha, lan ora brute force, kaya kanggo saben-saben. Ayo katon ing conto cilik. Ayo dadi nganggep kita duwe pesawat saka nomer sing arep kita nyaring (kurang saka 50), nambah 5, lan output pisanan 4 nomer saka sing isih kanggo console. Kepiye carane kita nindakake iki sadurunge:
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);

}
Ora koyone akeh kode, lan logika wis rada bingung. Ayo ndeleng carane bakal katon nggunakake stream:
Stream.of(46, 34, 24, 93, 91, 1, 34, 94)

      .filter(x -> x < 50)

      .map(x -> x + 5)

      .limit(4)

      .forEach(System.out::print);
Aliran banget nyederhanakake urip kanthi nyuda jumlah kode lan nggawe luwih gampang diwaca. Kanggo wong-wong sing pengin delve menyang topik iki ing liyane rinci, punika apik (Aku malah ngandika apik banget) artikel ing topik iki .

Lambda

Mbok menawa fitur sing paling penting lan ditunggu-tunggu yaiku penampilan lambdas. Apa iku lambda? Iki minangka blok kode sing bisa ditransfer menyang macem-macem papan supaya bisa dieksekusi mengko kaping pirang-pirang yen dibutuhake. Muni cukup mbingungake, apa ora? Cukup, nggunakake lambdas, sampeyan bisa ngetrapake metode antarmuka fungsional (jinis implementasi kelas anonim):
Runnable runnable = () -> { System.out.println("I'm running !");};

new Thread(runnable).start();
We dipun ginakaken cara roto () cepet lan tanpa tape abang rasah. Lan ya: Runnable minangka antarmuka fungsional. Aku uga nggunakake lambdas nalika nggarap stream (kaya ing conto karo stream ndhuwur). Kita ora bakal jero banget, amarga sampeyan bisa nyilem cukup jero, aku bakal ninggalake sawetara tautan supaya wong lanang sing isih penggali bisa nggali luwih jero:

ngarep

Java 8 duwe foreach anyar sing bisa digunakake karo aliran data kaya stream. Iki contone:
List<Integer> someList = Arrays.asList(1, 3, 5, 7, 9);

someList.forEach(x -> System.out.println(x));
(analog karo someList.stream().foreach(…))

Referensi metode

Metode referensi minangka sintaks anyar sing migunani sing dirancang kanggo ngrujuk metode utawa konstruktor kelas utawa obyek Jawa sing wis ana liwat :: Referensi metode ana ing papat jinis:
  1. Link menyang desainer:

    SomeObject obj = SomeObject::new

  2. Referensi metode statis:

    SomeObject::someStaticMethod

  3. Referensi kanggo metode non-statis saka obyek saka jinis tartamtu:

    SomeObject::someMethod

  4. A referensi kanggo cara biasa (non-statis) saka obyek tartamtu

    obj::someMethod

Asring, referensi metode digunakake ing stream tinimbang lambdas (metode referensi luwih cepet tinimbang lambdas, nanging luwih gampang diwaca).
someList.stream()

        .map(String::toUpperCase)

      .forEach(System.out::println);
Kanggo sing pengin informasi luwih lengkap babagan metode referensi:

Wektu API

Ana perpustakaan anyar kanggo nggarap tanggal lan wektu - java.time. Saka 8 nganti 13: ringkesan lengkap babagan versi Jawa.  Bagean 1 - 2API anyar padha karo Joda-Time. Bagean paling penting saka API iki yaiku:
  • LocalDate minangka tanggal tartamtu, minangka conto - 2010-01-09;
  • LocalTime - wektu njupuk menyang akun zona wektu - 19:45:55 (analog kanggo LocalDate);
  • LocalDateTime - kombo LocalDate + LocalTime - 2020-01-04 15:37:47;
  • ZoneId - nggambarake zona wektu;
  • Jam - nggunakake jinis iki sampeyan bisa ngakses wektu lan tanggal saiki.
Ing ngisor iki sawetara artikel sing menarik banget babagan topik iki:

Opsional

Iki kelas anyar ing paket java.util , pambungkus Nilai kang trick iku uga bisa aman ngemot null . Nampa opsional: Yen kita pass nullOptional<String> someOptional = Optional.of("Something"); ing Optional.of , kita bakal njaluk NullPointerException favorit . Kanggo kasus kaya mengkono padha nggunakake: - ing cara iki sampeyan ora kudu wedi null. Sabanjure, gawe opsional sing wiwitane kosong: Kanggo mriksa yen kosong, gunakake: bakal ngasilake bener utawa salah kanggo kita. Nindakake tumindak tartamtu yen ana nilai, lan ora nindakake apa-apa yen ora ana regane: Cara mbalikke sing ngasilake nilai liwati yen Opsional kosong (kayata rencana serep): Sampeyan bisa terus kanggo wektu sing suwe banget ( Begjanipun, Pilihan wis nambah cara karo loro tangan loman), nanging kita ora bakal manggon ing iki. Luwih becik aku ninggalake sawetara tautan kanggo wiwitan: 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")); We tindak liwat inovasi paling misuwur ing Jawa 8 - iku ora kabeh. Yen sampeyan pengin ngerti luwih akeh, aku ninggalake iki kanggo sampeyan:

Jawa 9

Dadi, ing 21 September 2017, jagad weruh JDK 9. Java 9 iki dilengkapi fitur sing sugih. Nalika ora ana konsep basa anyar, API anyar lan printah diagnostik mesthi bakal narik kawigaten para pangembang. Saka 8 nganti 13: ringkesan lengkap babagan versi Jawa.  Bagean 1 - 4

JShell (REPL - loop read-eval-print)

Iki minangka implementasi Java saka konsol interaktif sing digunakake kanggo nguji fungsionalitas lan nggunakake konstruksi sing beda ing konsol, kayata antarmuka, kelas, enum, operator, lsp. Kanggo miwiti JShell, sampeyan mung kudu nulis jshell ing terminal. Banjur kita bisa nulis apa wae sing diidini: Saka 8 nganti 13: ringkesan lengkap babagan versi Jawa.  Bagean 1 - 5Nggunakake JShell, sampeyan bisa nggawe metode tingkat paling dhuwur lan digunakake ing sesi sing padha. Cara kasebut bakal bisa digunakake kaya cara statis, kajaba tembung kunci statis bisa diilangi. Waca liyane ing manual Java 9. REPL (JShell) .

Pribadi

Miwiti karo versi Jawa 9, kita duwe kesempatan kanggo nggunakake cara pribadi ing antarmuka (metode standar lan statis, amarga kita ora bisa ngalahake wong liya amarga akses ora cukup). private static void someMethod(){} try-with-resources Kemampuan kanggo nangani pengecualian Coba-With-Resources wis ditingkatake:
BufferedReader reader = new BufferedReader(new FileReader("....."));
  try (reader2) {
  ....
}

Modularitas ( jigsaw )

Modul minangka klompok paket lan sumber daya sing ana gandhengane karo file deskriptor modul anyar. Pendekatan iki digunakake kanggo ngeculake kopling kode. Kopling longgar minangka faktor kunci kanggo njaga kode lan ekstensibilitas. Modularitas ditindakake ing macem-macem tingkat:
  1. Basa pemrograman.
  2. Mesin virtual.
  3. Standar java API.
JDK 9 dilengkapi 92 modul: kita bisa nggunakake utawa nggawe dhewe. Ing ngisor iki sawetara pranala kanggo tampilan sing luwih jero:

Koleksi sing ora bisa diganti

Ing Jawa 9, dadi bisa nggawe lan ngisi koleksi kanthi siji baris, nalika nggawe ora bisa diganti (sadurunge, kanggo nggawe koleksi sing ora bisa diganti, kita kudu nggawe koleksi, ngisi data, lan nelpon metode, contone, Collections.unmodifiableList). Tuladha kreasi kaya mangkene: List someList = List.of("first","second","third");

Inovasi liyane:

  • ditambahi Opsional (cara anyar ditambahake);
  • antarmuka ProcessHandle lan ProcessHandle katon kanggo ngontrol tumindak sistem operasi;
  • G1 - kolektor sampah standar;
  • Klien HTTP kanthi dhukungan kanggo protokol HTTP/2 lan WebSocket;
  • ditambahi Stream;
  • ditambahaké framework Reactive Streams API (kanggo program reaktif);
Kanggo kecemplung sing luwih lengkap ing Jawa 9, aku menehi saran supaya maca:

Jawa 10

Dadi, nem sasi sawise dirilis Java 9, ing Maret 2018 (aku kelingan kaya wingi), Java 10 teka ing adegan. Saka 8 nganti 13: ringkesan lengkap babagan versi Jawa.  Bagean 1 - 6

var

Saiki kita ora kudu nyedhiyani jinis data. Kita menehi tandha pesen minangka var lan compiler nemtokake jinis pesen kanthi jinis initializer sing ana ing sisih tengen. Fitur iki mung kasedhiya kanggo variabel lokal kanthi initializer: ora bisa digunakake kanggo argumen metode, jinis bali, lan sapiturute, amarga ora ana initializer sing bisa nemtokake jinis kasebut. Tuladha var (kanggo jinis String):
var message = "Some message…..";
System.out.println(message);
var ora tembung kunci: iku ateges jeneng jinis reserved, kaya int . Keuntungan saka var gedhe: deklarasi jinis njupuk akeh manungsa waé tanpa nggawa entuk manfaat, lan fitur iki bakal ngirit wektu. Nanging ing wektu sing padha, yen variabel dipikolehi saka rantai metode sing dawa, kode kasebut dadi kurang bisa diwaca, amarga ora jelas apa jenis obyek sing ana ing kono. Darmabakti kanggo sing pengin luwih kenal karo fungsi iki:

JIT compiler (GraalVM)

Tanpa basa-basi, aku ngelingake yen sampeyan mbukak printah javac, aplikasi Java dikompilasi saka kode Java menyang bytecode JVM, yaiku perwakilan binar aplikasi kasebut. Nanging prosesor komputer biasa ora bisa mung nglakokake bytecode JVM. Kanggo program JVM bisa digunakake, sampeyan kudu compiler liyane kanggo bytecode iki, kang diowahi menyang kode mesin sing prosesor wis bisa digunakake. Dibandhingake karo javac, kompiler iki luwih rumit, nanging uga ngasilake kode mesin sing luwih dhuwur. Saiki, OpenJDK ngemot mesin virtual HotSpot, sing uga duwe loro kompiler JIT utama. Pisanan, C1 ( kompiler klien ), dirancang kanggo operasi kacepetan sing luwih dhuwur, nanging optimasi kode nandhang sangsara. Kapindho yaiku C2 (server compiler). Kacepetan eksekusi nandhang sangsara, nanging kode kasebut luwih dioptimalake. Nalika kang digunakake? C1 apik kanggo aplikasi desktop ngendi JIT ngaso dawa undesirable, lan C2 apik kanggo long-mlaku program server ngendi nglampahi wektu liyane ing kompilasi cukup ditanggung. Kompilasi multi-tingkat yaiku nalika kompilasi pisanan liwat C1, lan asil liwat C2 (digunakake kanggo optimasi luwih). GraalVM minangka proyek sing digawe kanggo ngganti HotSpot. Kita bisa mikir Graal minangka sawetara proyek sing gegandhengan: kompiler JIT anyar kanggo HotSpot lan mesin virtual polyglot anyar. Kekhasan penyusun JIT iki yaiku ditulis nganggo basa Jawa. Kauntungan saka compiler Graal yaiku safety, yaiku, ora kacilakan, nanging pangecualian, ora bocor memori. Kita uga bakal duwe support IDE apik, lan kita bakal bisa nggunakake debuggers, profiler utawa alat trep liyane. Kajaba iku, compiler bisa uga independen saka HotSpot, lan bakal bisa nggawe versi JIT-nyawiji dhewe luwih cepet. Kanggo penggali:

Paralel G1

Penagih sampah G1 mesthi kelangan, ora mangu-mangu, nanging uga nduweni titik lemah: nindakake siklus GC lengkap siji-Utas. Ing wektu nalika sampeyan mbutuhake kabeh kekuwatan hardware sampeyan bisa kumpul kanggo nemokake obyek sing ora digunakake, kita diwatesi mung siji benang. Jawa 10 mbenerake iki. Saiki GC saiki bisa digunakake karo kabeh sumber daya sing ditambahake (yaiku, dadi multi-threaded). Kanggo entuk iki, pangembang basa wis nambah isolasi saka sumber utama saka GC, nggawe antarmuka resik apik kanggo GC. Pangembang cuteness iki, OpenJDK, kudu khusus ngresiki dump ing kode supaya ora mung kanggo nyederhanakake nggawe GCs anyar sabisa, nanging uga kanggo nggawe iku bisa kanggo cepet mateni GCs rasah saka Déwan. Salah sawijining kritéria utama kanggo sukses yaiku ora ana drawdown ing kacepetan operasi sawise kabeh dandan kasebut. Ayo ndeleng uga: Inovasi liyane:
  1. Antarmuka Pengumpul Sampah sing resik dienalake. Iki nambah isolasi kode sumber saka macem-macem kolektor sampah, supaya bisa nggabungake kolektor alternatif kanthi cepet lan tanpa rasa lara;
  2. Nggabungake sumber JDK dadi siji repositori;
  3. Koleksi nampa cara anyar - copyOf (Koleksi) , sing ngasilake salinan sing ora bisa diganti saka koleksi iki;
  4. Opsional (lan varian) duwe cara anyar .orElseThrow () ;
  5. Wiwit saiki, JVMs ngerti yen lagi mlaku ing wadhah Docker lan bakal njupuk konfigurasi khusus wadhah tinimbang takon sistem operasi kasebut dhewe.
Mangkene sawetara bahan liyane kanggo introduksi sing luwih rinci babagan Java 10: Aku biyen bingung banget amarga sawetara versi Jawa diarani 1.x. Aku pengin jelas: versi Java sadurunge 9 mung duwe skema jeneng sing beda. Contone, Java 8 uga bisa diarani 1.8 , Java 5 - 1.5 , lan liya-liyane. Lan saiki kita weruh yen kanthi transisi menyang rilis saka Java 9, skema penamaan uga wis diganti, lan versi Jawa ora ana awalan karo 1.x. . Iki pungkasan saka bagean pisanan: kita nliti fitur menarik anyar java 8-10. Ayo terus kenalan karo sing paling anyar ing postingan sabanjure .
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION