Saat menggunakan Java8 stream api baru untuk menemukan satu elemen spesifik dalam koleksi, saya menulis kode seperti ini:
String theFirstString = myCollection.stream()
.findFirst()
.get();
Di sini IntelliJ memperingatkan bahwa get () dipanggil tanpa memeriksa isPresent () terlebih dahulu.
Namun, kode ini:
String theFirstString = myCollection.iterator().next();
... tidak menghasilkan peringatan.
Apakah ada beberapa perbedaan mendasar antara kedua teknik, yang membuat pendekatan streaming lebih "berbahaya" dalam beberapa cara, bahwa sangat penting untuk tidak pernah memanggil get () tanpa memanggil isPresent () terlebih dahulu? Googling sekitar, saya menemukan artikel yang berbicara tentang bagaimana programmer ceroboh dengan Opsional <> dan menganggap mereka dapat memanggil get () kapan saja.
Masalahnya, saya ingin mendapatkan pengecualian yang dilemparkan ke saya sedekat mungkin ke tempat kode saya bermasalah, yang dalam kasus ini adalah tempat saya memanggil get () ketika tidak ada elemen yang ditemukan. Saya tidak ingin harus menulis esai yang tidak berguna seperti:
Optional<String> firstStream = myCollection.stream()
.findFirst();
if (!firstStream.isPresent()) {
throw new IllegalStateException("There is no first string even though I totally expected there to be! <sarcasm>This exception is much more useful than NoSuchElementException</sarcasm>");
}
String theFirstString = firstStream.get();
... kecuali ada bahaya dalam memprovokasi pengecualian dari get () yang tidak saya sadari?
Setelah membaca respons dari Karl Bielefeldt dan komentar dari Hulk, saya menyadari kode pengecualian saya di atas agak canggung, berikut ini sesuatu yang lebih baik:
String errorString = "There is no first string even though I totally expected there to be! <sarcasm>This exception is much more useful than NoSuchElementException</sarcasm>";
String firstString = myCollection.stream()
.findFirst()
.orElseThrow(() -> new IllegalStateException(errorString));
Ini terlihat lebih bermanfaat dan mungkin akan menjadi alami di banyak tempat. Saya masih merasa seperti saya ingin dapat memilih satu elemen dari daftar tanpa harus berurusan dengan semua ini, tapi itu bisa saja saya perlu membiasakan diri dengan konstruksi semacam ini.