17. Menehi conto sukses lan ora sukses nggunakake Opsional
Upaminipun kita duwe seri tartamtu saka nilai liwat kang liwat stream, lan ing pungkasan kita njaluk sawetara opsional minangka asil:Optional<String> stringOptional = Stream.of("a", "ab", "abc", "abcd")
.filter(str -> str.length() >= 3)
.findAny();
Kita, kaya sing dikarepake, kudu entuk nilai saka Opsional iki . Mung nggunakake get() iku cara sing ala:
String result = stringOptional.get();
Nanging cara iki mesthine entuk nilai saka Opsional lan bali menyang kita? Iki, mesthi, bener, nanging yen ana makna. Inggih, yen nilai ing stream padha beda, lan ing pungkasan kita nampa kosong Pilihan , nalika kita nyoba kanggo njupuk Nilai saka iku nggunakake cara njaluk () , ing ngisor iki bakal di buwang: Kang ora apik. Ing kasus iki, luwih becik nggunakake konstruksi ing ngisor iki:
-
String result = null; if (stringOptional.isPresent()) { stringOptional.get(); }
Ing kasus iki, kita mriksa manawa unsur kasebut ana ing Opsional . Yen ora, string sing diasilake nduweni nilai lawas.
-
String result = stringOptional.orElse("default value");
Ing kasus iki, kita nemtokake sawetara nilai gawan, kang bakal diwenehi kanggo senar asil ing cilik saka Opsional kosong .
-
String result = stringOptional.orElseThrow(() -> new CustomException());
Ing kasus iki, kita dhewe mbuwang pangecualian nalika Opsional kosong .
18. Apa bisa nyatakake metode utama minangka final?
Ya, mesthi, ora ana sing ngalangi kita nyatakake metode utama () minangka final . Compiler ora bakal ngasilake kesalahan. Nanging kudu dieling-eling manawa metode apa wae sawise nyatakake minangka final bakal dadi cara pungkasan - ora ditimpa. Senajan, sing bakal redefine utama ???19. Apa bisa ngimpor paket / kelas sing padha kaping pindho? Apa akibate?
Ya sampeyan bisa. Akibate? Kita bakal duwe sawetara impor sing ora perlu sing bakal ditampilake Intelijj IDEA minangka werna abu-abu, yaiku. ora dienggo.20. Apa Casting? Nalika kita bisa entuk ClassCastException?
Casting, utawa jinis casting , yaiku proses ngowahi siji jinis data menyang jinis data liyane: kanthi manual (casting implisit) utawa kanthi otomatis (casting jinis eksplisit). Konversi otomatis ditindakake dening compiler, lan konversi manual ditindakake dening pangembang. Tipe casting kanggo primitif lan kelas rada beda, mula kita bakal nimbang kanthi kapisah. Jinis primitif Conto casting otomatis saka jinis primitif:int value = 17;
double convertedValue = value;
Kaya sing sampeyan ngerteni, ora ana manipulasi tambahan kajaba tandha = sing dibutuhake ing kene. Tuladha casting manual saka jinis primitif:
double value = 17.89;
int convertedValue = (int)value;
Ing kasus iki, kita bisa mirsani cast manual, kang dipun ginakaken nggunakake (int) , kang bagean sawise koma bakal dibuwak lan convertedValue bakal duwe nilai - 17. Waca liyane babagan casting jinis primitif ing artikel iki . Saiki ayo pindhah menyang obyek. Jinis referensi Kanggo jinis referensi, casting otomatis bisa kanggo kelas turunan kanggo kelas tiyang sepah. Iki uga diarani polimorfisme . Contone, kita duwe kelas Singa sing entuk warisan saka kelas Kucing . Ing kasus iki, konversi otomatis bakal katon kaya iki:
Cat cat = new Lion();
Nanging kanthi cast eksplisit , kabeh luwih rumit, amarga ora ana fungsi kanggo ngilangi keluwihan, kaya primitif. Lan mung nindakake konversi eksplisit saka formulir:
Lion lion= (Lion)new Cat();
Sampeyan bakal entuk kesalahan: Nyatane, sampeyan bisa nambah cara menyang kelas turunan Singa sing ora asli ing kelas Cat , banjur nyoba nelpon, amarga jinis obyek sampeyan bakal dadi Lion . Nah, ora ana logika ing babagan iki. Mulane, penyempitan jinis mung bisa ditindakake nalika obyek asli saka jinis Lion nanging banjur dibuwang menyang kelas induk:
Lion lion = new Lion();
Cat cat = lion;
Lion newLion = (Lion)cat;
Uga, kanggo linuwih luwih, cast narrowing kanggo obyek dianjurake nggunakake instanceOf construct :
if (cat instanceof Lion) {
newLion = (Lion)new Cat();
}
Waca liyane babagan jinis referensi cast ing artikel iki .
21. Yagene kerangka modern utamane mung nggunakake pangecualian sing ora dicenthang?
Aku iki kabeh amarga nangani istiméwa dicenthang isih kode spageti sing bola nang endi wae, nanging ora nemen needed ing kabeh kasus. Ing kasus kaya mengkono, luwih gampang kanggo nindakake pangolahan ing framework, supaya ora kanggo sepisan maneh mindhah iki menyang pundak pangembang. Ya, mesthi, kahanan darurat bisa uga muncul, nanging pangecualian sing ora dicenthang sing padha bisa ditangani kanthi cara sing luwih trep, tanpa ngganggu proses kanthi nyoba-nyoba lan tanpa ngliwati metode kasebut. Cukup mung kanggo ngowahi pangecualian dadi sawetara respon HTTP ing exceptionHandler .22. Apa impor statis?
Nalika nggunakake data statis (metode, variabel), sampeyan ora bisa nggawe obyek dhewe, nanging nindakaken kanthi jeneng kelas, nanging malah ing kasus iki kita kudu referensi kanggo kelas. Kabeh iku prasaja: ditambahake nggunakake impor biasa. Nanging apa yen kita nggunakake cara statis tanpa nulis jeneng kelas, kaya-kaya cara statis saka kelas saiki? Iki bisa ditindakake kanthi ngimpor statis! Ing kasus iki, kita kudu nulis impor statis lan pranala menyang cara kasebut. Kaya iki, contone, cara statis saka kelas Math kanggo ngitung nilai kosinus:import static java.lang.Math.cos;
Akibaté, kita bisa nggunakake cara tanpa nemtokake jeneng kelas:
double result = cos(60);
Kita uga bisa mbukak kabeh metode statis saka kelas bebarengan nggunakake impor statis:
import static java.lang.Math.*;
23. Apa hubungan antarane metode hashCode () lan padha ()?
Miturut Oracle , aturan kasebut: Yen rong obyek padha (i.e. metode sing padha () ngasilake bener ), kudu duwe kode hash sing padha. Ing wektu sing padha, aja lali yen rong obyek sing beda bisa duwe kode hash sing padha. Kanggo mangerteni kenapa padha () lan hashCode () tansah ditindhes ing pasangan, nimbang kasus ing ngisor iki:-
Loro-lorone cara ditindhes.
Ing kasus iki, loro obyek beda karo negara internal padha bakal bali witjaksono () - bener , nalika hashCode () bakal bali nomer padha.
Pranyata kabeh ora apa-apa, amarga aturan kasebut ditindakake.
-
Loro-lorone cara ora diganti.
Ing kasus iki, loro obyek beda karo negara internal padha bakal bali palsu nalika padha () , wiwit comparison dening referensi liwat operator == .
Metode hashCode () uga bakal ngasilake nilai sing beda-beda (kemungkinan) amarga ngasilake nilai sing diowahi saka alamat lokasi memori. Nanging kanggo obyek padha Nilai iki bakal padha, kaya witjaksono () ing kasus iki bakal bali bener mung nalika referensi nuduhake obyek padha.
Pranyata ing kasus iki kabeh ok lan aturan wis kawujud.
-
Ditimpa padha karo () , ora ditimpa hashCode () .
Ing kasus iki, kanggo rong obyek beda karo negara internal padha, padha () bakal bali bener , lan hashCode () bakal bali (paling kamungkinan) nilai beda.
Iki nglanggar aturan, mula ora dianjurake kanggo nindakake iki.
-
padha () ora ditimpa , hashCode () ditimpa .
Ing kasus iki, kanggo rong obyek beda karo negara internal padha, padha () bakal bali palsu lan hashCode () bakal ngasilake nilai sing padha.
Ana sing nglanggar aturan, mula pendekatan kasebut ora bener.
24. Nalika kelas BufferedInputStream lan BufferedOutputStream digunakake?
InputStream digunakake kanggo maca data byte-by-byte saka sawetara sumber, lan OutputStream digunakake kanggo nulis data byte-byte. Nanging operasi byte-by-byte bisa banget ora trep lan mbutuhake pangolahan tambahan (supaya bisa maca / nulis teks kanthi normal). Bener, kanggo nyederhanakake cathetan bait kasebut, BufferedOutputStream dienalake , lan BufferedInputStream dikenalake kanggo maca . Kelas-kelas iki ora luwih saka buffer sing nglumpukake data, ngidini sampeyan nggarap data ora bita dening bait, nanging kabeh paket data (array). Nalika digawe, BufferedInputStream njupuk conto saka jinis InputStream ing konstruktor , saka ngendi data diwaca:BufferedInputStream bufferedInputStream = new BufferedInputStream(System.in);
byte[] arr = new byte[100];
bufferedInputStream.read(arr);
System.in minangka obyek InputStream sing maca data saka konsol. Yaiku, nggunakake obyek BufferedInputStream iki , kita bisa maca data saka InputStream kanthi nulis menyang larik sing dilewati. Iki dadi jinis pambungkus saka kelas InputStream . Array arr saka conto iki yaiku array sing nampa data saka BufferedInputStream . Sing, banjur maca data saka InputStream karo larik liyane, sing kanthi standar ukurane 2048 bita. Semono uga kanggo BufferedOutputStream : conto saka jinis OutputStream kudu diterusake menyang konstruktor , ing ngendi kita bakal nulis data ing kabeh susunan:
byte[] arr = "Hello world!!!".getBytes();
BufferedOutputStream bufferedInputStream = new BufferedOutputStream(System.out);
bufferedInputStream.write(arr);
bufferedInputStream.flush();
System.out minangka obyek OutputStream sing nulis data menyang console. Cara flush () ngirim data saka BufferedOutputStream menyang OutputStream , flushing BufferedOutputStream ing proses . Tanpa metode iki, ora ana sing bakal direkam. Lan padha karo conto sadurunge: arr minangka array saka data sing ditulis menyang BufferedOutputStream . Saka ing kono padha ditulis kanggo OutputStream ing Uploaded beda, kang minangka standar ukuran 512 bita. Waca liyane babagan rong kelas kasebut ing artikel kasebut .
25. Apa bedane kelas java.util.Collection lan java.util.Collections?
Koleksi minangka antarmuka sing dadi kepala hirarki koleksi. Iki ngenalake kelas sing ngidini sampeyan nggawe, ngemot, lan ngowahi kabeh klompok obyek. Ana akeh cara sing kasedhiya kanggo iki, kaya nambah () , mbusak () , ngemot () lan liya-liyane. Antarmuka utama kelas Koleksi :-
Set minangka antarmuka sing njlèntrèhaké sawijining set sing ngemot unsur unik (ora diulang).
-
Dhaptar minangka antarmuka sing nggambarake struktur data sing nyimpen urutan obyek sing diurutake. Obyek iki nampa indeks dhewe (nomer), nggunakake sing bisa sesambungan karo wong-wong mau: njupuk, mbusak, ngganti, nimpa.
-
Antrian minangka antarmuka sing njlèntrèhaké struktur data kanthi unsur nyimpen ing wangun antrian sing ngetutake aturan - FIFO - First In First Out .
-
addAll(Koleksi<? super T> koleksi, T...elemen) - nambah unsur liwati jinis T kanggo koleksi .
-
copy(Daftar<? super T> dest, List<? ngluwihi T> src) - nyalin kabeh unsur saka dhaftar src menyang dhaptar ing dest .
-
emptyList () - ngasilake dhaftar kosong.
-
max (Koleksi<? ngluwihi T> koleksi, Comparator<? super T> comp) - Ngasilake unsur maksimum koleksi diwenehi miturut urutan kasebut dening comparator kasebut.
-
unmodifiableList(List<? ngluwihi T> dhaftar) - ngasilake perwakilan unmodifiable saka dhaftar liwati.
GO TO FULL VERSION