Kesalahan utama Anda adalah Anda masih berpikir dalam istilah yang lebih prosedural. Ini tidak dimaksudkan sebagai kritik terhadap Anda sebagai pribadi, itu hanya sebuah pengamatan. Berpikir dalam istilah yang lebih fungsional datang dengan waktu dan latihan, dan oleh karena itu metodenya hadir dan terlihat seperti hal-hal yang paling jelas benar untuk memanggil Anda. Kesalahan kecil sekunder Anda adalah membuat Opsional di dalam metode Anda. Opsional dimaksudkan untuk membantu mendokumentasikan bahwa sesuatu mungkin atau tidak dapat mengembalikan nilai. Anda mungkin tidak mendapatkan apa-apa.
Ini telah menyebabkan Anda menulis kode yang terbaca dengan sempurna yang tampaknya masuk akal, tetapi Anda tergoda oleh temptresses kembar yang kejam yang didapat dan hadir.
Tentu saja pertanyaannya dengan cepat menjadi "mengapa ada dan hadir di sana?"
Satu hal yang banyak orang lewatkan adalah isPresent () adalah bahwa itu bukan sesuatu yang dibuat untuk kode baru yang ditulis oleh orang-orang sepenuhnya di papan dengan bagaimana lambda sangat berguna, dan yang menyukai hal fungsional.
Namun demikian, memberi kami beberapa (dua) manfaat (?) Baik, bagus, glamourous:
- Ini memudahkan transisi kode lama untuk menggunakan fitur-fitur baru.
- Ini memudahkan kurva belajar Opsional.
Yang pertama agak sederhana.
Bayangkan Anda memiliki API yang terlihat seperti ini:
public interface SnickersCounter {
/**
* Provides a proper count of how many snickers have been consumed in total.
*/
public SnickersCount howManySnickersHaveBeenEaten();
/**
* returns the last snickers eaten.<br>
* If no snickers have been eaten null is returned for contrived reasons.
*/
public Snickers lastConsumedSnickers();
}
Dan Anda memiliki kelas lama menggunakan ini seperti itu (isi bagian yang kosong):
Snickers lastSnickers = snickersCounter.lastConsumedSnickers();
if(null == lastSnickers) {
throw new NoSuchSnickersException();
}
else {
consumer.giveDiabetes(lastSnickers);
}
Contoh dibuat-buat untuk memastikan. Tapi bersabarlah di sini.
Java 8 sekarang telah diluncurkan dan kami berusaha keras untuk naik. Jadi salah satu hal yang kami lakukan adalah kami ingin mengganti antarmuka lama kami dengan sesuatu yang mengembalikan Opsional. Mengapa? Karena seperti orang lain telah dengan anggun menyebutkan:
Ini mengeluarkan dugaan apakah sesuatu bisa batal atau tidak.
Ini sudah ditunjukkan oleh orang lain. Tapi sekarang kita punya masalah. Bayangkan kita punya (maafkan saya ketika saya menekan alt + F7 pada metode yang tidak bersalah), 46 tempat di mana metode ini disebut dalam kode warisan yang teruji dengan baik yang melakukan pekerjaan yang sangat baik. Sekarang Anda harus memperbarui semua ini.
INI adalah tempat dimana Hadir bersinar.
Karena sekarang: Snickers lastSnickers = snickersCounter.lastConsumedSnickers (); if (null == lastSnickers) {melempar NoSuchSnickersException baru (); } else {consumer.giveDiabetes (lastSnickers); }
menjadi:
Optional<Snickers> lastSnickers = snickersCounter.lastConsumedSnickers();
if(!lastSnickers.isPresent()) {
throw new NoSuchSnickersException();
}
else {
consumer.giveDiabetes(lastSnickers.get());
}
Dan ini adalah perubahan sederhana yang dapat Anda berikan kepada junior baru: Dia dapat melakukan sesuatu yang bermanfaat, dan dia akan menjelajahi basis kode pada saat yang sama. menang-menang. Bagaimanapun, sesuatu yang mirip dengan pola ini cukup luas. Dan sekarang Anda tidak perlu menulis ulang kode untuk menggunakan lambdas atau apa pun. (Dalam kasus khusus ini akan sepele, tetapi saya meninggalkan contoh pemikiran di mana itu akan sulit sebagai latihan untuk pembaca.)
Perhatikan bahwa ini berarti cara Anda melakukannya pada dasarnya adalah cara untuk menangani kode lawas tanpa melakukan penulisan ulang yang mahal. Jadi bagaimana dengan kode baru?
Nah, dalam kasus Anda, di mana Anda hanya ingin mencetak sesuatu, Anda cukup melakukan:
snickersCounter.lastConsumedSnickers (). ifPresent (System.out :: println);
Yang cukup sederhana, dan sangat jelas. Titik yang perlahan menggelegak ke permukaan kemudian, adalah bahwa ada kasus penggunaan untuk get () dan isPresent (). Mereka ada di sana untuk memungkinkan Anda memodifikasi kode yang ada secara mekanis untuk menggunakan tipe yang lebih baru tanpa terlalu memikirkannya. Karena itu, apa yang Anda lakukan salah arah dengan cara berikut:
- Anda memanggil metode yang dapat mengembalikan nol. Gagasan yang benar adalah bahwa metode mengembalikan nol.
- Anda menggunakan metode bandaid lawas untuk menangani opsi ini, alih-alih menggunakan metode baru yang lezat yang mengandung keanggunan lambda.
Jika Anda ingin menggunakan Opsional sebagai pemeriksaan keamanan-nol sederhana, yang harus Anda lakukan hanyalah ini:
new Optional.ofNullable(employeeServive.getEmployee())
.map(Employee::getId)
.ifPresent(System.out::println);
Tentu saja, versi tampan ini terlihat seperti:
employeeService.getEmployee()
.map(Employee::getId)
.ifPresent(System.out::println);
Ngomong-ngomong, meskipun tidak diperlukan, saya merekomendasikan penggunaan baris baru per operasi, sehingga lebih mudah dibaca. Mudah dibaca dan dimengerti ketukan setiap hari dalam seminggu.
Ini tentu saja merupakan contoh yang sangat sederhana di mana mudah untuk memahami semua yang kami coba lakukan. Tidak selalu sesederhana ini di kehidupan nyata. Tetapi perhatikan bagaimana dalam contoh ini, apa yang kami ungkapkan adalah niat kami. Kami ingin MENDAPATKAN karyawan, DAPATKAN ID-nya, dan jika mungkin, cetaklah. Ini adalah kemenangan besar kedua dengan Opsional. Itu memungkinkan kita membuat kode yang lebih jelas. Saya juga berpikir bahwa melakukan hal-hal seperti membuat metode yang melakukan banyak hal sehingga Anda dapat memasukkannya ke peta secara umum adalah ide yang bagus.