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:-
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.
-
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.
-
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);
Predikat - njupuk sawetara nilai T minangka argumen, ngasilake boolean.
Tuladha:boolean 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:
- artikel babagan ekspresi lambda ing Jawa 8 ing Habré
- artikel babagan ekspresi lambda ing Jawa ing blog Alexander Kosarev
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:-
Link menyang desainer:
SomeObject obj = SomeObject::new
-
Referensi metode statis:
SomeObject::someStaticMethod
-
Referensi kanggo metode non-statis saka obyek saka jinis tartamtu:
SomeObject::someMethod
-
A referensi kanggo cara biasa (non-statis) saka obyek tartamtu
obj::someMethod
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. API 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.
- Jawa lan wektu: bagean siji lan loro ing Habré
- Introduction to Date/Time API in Java 8
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"));
- Jawa Opsional - rama holivars
- Opsional: Kucing Schrödinger ing Jawa 8
- Kelas Opsional anyar ing Jawa 8, dudu panacea kanggo NullPointerException
- Fitur Java 8: Pandhuan Ultimate kanggo JavaRush - Bagian Siji lan Loro ;
- Anyar ing Jawa 8 ing Habré ;
- Top 10 Java 8 fitur sing wong ora ngomong bab ;
- Jawa 8 Tutorial .
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.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: Nggunakake 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:- Basa pemrograman.
- Mesin virtual.
- Standar java API.
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);
- Review Jawa 9 ing Habré
- Jawa 9. Apa sing anyar?
- Jawa 9: Fitur Anyar
- Jawa 9 - Sampeyan wis nganyarke durung? ora? Lan ora perlu ...!?
- Sander Mak ing transisi menyang modul Jawa
Jawa 10
Dadi, nem sasi sawise dirilis Java 9, ing Maret 2018 (aku kelingan kaya wingi), Java 10 teka ing adegan.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:
- Jawa 10 LocalVariable Type-Inference
- Kontak pisanan karo "var" ing Jawa 10
- 26 Tips kanggo Nggunakake Tipe var ing Jawa
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:- Deep Dive menyang New Java JIT Compiler
- Graal: Carane nggunakake compiler JVM JIT anyar ing urip nyata
- Carane Graal dianggo - Java JVM JIT compiler
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:- 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;
- Nggabungake sumber JDK dadi siji repositori;
- Koleksi nampa cara anyar - copyOf (Koleksi) , sing ngasilake salinan sing ora bisa diganti saka koleksi iki;
- Opsional (lan varian) duwe cara anyar .orElseThrow () ;
- Wiwit saiki, JVMs ngerti yen lagi mlaku ing wadhah Docker lan bakal njupuk konfigurasi khusus wadhah tinimbang takon sistem operasi kasebut dhewe.
- Pandhuan Basa Jawa 10
- 10 JDK 10 fitur pangembang Jawa kudu ngerti
- Apa Anyar ing Jawa 10: Pérangan Kapisan lan Kalih
GO TO FULL VERSION