Pola Optional
Guava sangat bagus, karena membantu menghilangkan ambiguitas dengan null. Metode transform
sangat membantu untuk membuat rantai metode null-safe ketika bagian pertama dari rantai tersebut mungkin tidak ada, namun tidak berguna ketika bagian lain dari rantai tersebut tidak ada.
Pertanyaan ini terkait dengan Jenis Opsional Jambu Biji, ketika transformasi mengembalikan Opsional lain, yang pada dasarnya menanyakan pertanyaan yang sama tetapi untuk kasus penggunaan berbeda yang menurut saya mungkin bukan tujuan penggunaan Optional
(penanganan kesalahan).
Pertimbangkan metode Optional<Book> findBook(String id)
. findBook(id).transform(Book.getName)
berfungsi seperti yang diharapkan. Jika tidak ditemukan buku kita mendapat Absent<String>
, jika ada buku ditemukan kita mendapat Present<String>
.
Dalam kasus umum di mana metode perantara dapat mengembalikan null
/absent()
, tampaknya tidak ada cara yang elegan untuk menyambungkan panggilan. Misalnya, asumsikan Book
memiliki metode Optional<Publisher> getPublisher()
, dan kita ingin semua buku diterbitkan oleh penerbit sebuah buku. Sintaks aslinya adalah findBook(id).transform(Book.getPublisher).transform(Publisher.getPublishedBooks)
, namun ini akan gagal karena panggilan transform(Publisher.getPublishedBooks)
sebenarnya akan mengembalikan Optional<Optional<Publisher>>
.
Tampaknya cukup masuk akal untuk memiliki metode seperti transform()
di Optional
yang akan menerima fungsi yang mengembalikan Optional
. Ini akan bertindak persis seperti implementasi saat ini kecuali bahwa itu tidak akan membungkus hasil fungsi dalam Opsional. Implementasinya (untuk Present
) mungkin berbunyi:
public abstract <V> Optional<V> optionalTransform(Function<? super T, Optional<V>> function) {
return function.apply(reference);
}
Implementasi untuk Absent
tidak berubah dari transform
:
public abstract <V> Optional<V> optionalTransform(Function<? super T, Optional<V>> function) {
checkNotNull(function);
return Optional.absent();
}
Akan lebih baik juga jika ada cara untuk menangani metode yang mengembalikan null
dibandingkan dengan Optional
untuk bekerja dengan objek lama. Metode seperti itu akan seperti transform
tetapi cukup panggil Optional.fromNullable
pada hasil fungsinya.
Saya ingin tahu apakah ada orang lain yang mengalami gangguan ini dan menemukan solusi yang bagus (yang tidak melibatkan penulisan kelas Optional
Anda sendiri). Saya juga ingin mendengar pendapat tim Guava atau diarahkan ke diskusi terkait masalah tersebut (saya tidak menemukannya dalam pencarian saya).