Saat mengembangkan API saya yang tidak terikat dengan kode warisan apa pun, saya sering menemukan diri saya menulis metode yang murni pipa Streams diakhiri dengan mengumpulkan hasilnya. Seperti yang ini:
ImmutableSet<T> deriveSomethingMeaningfulFromPrivateState() {
return myPrivateThingies.stream()
.map(this::ownerOfThing)
.map(Owner::socialStatus)
.filter(SocialStatus::isHeAFineMatey)
.collect(MyCustomCollectors.toImmutableSet());
}
Sekarang, sebagian besar klien dari kelas ini biasanya akan membutuhkan Koleksi (dalam hal ini, ImmutableSet) untuk mencari elemen dan beralih di atasnya, tetapi beberapa klien dapat mengambil manfaat dari memiliki Stream sehingga mereka dapat menyalurkan beberapa operasi lebih dari itu Streaming tanpa perlu mendapatkan aliran baru dari Koleksi. Jadi mengembalikan Stream memberi klien superset opsi yang akan mereka miliki jika mereka hanya memiliki Koleksi (setelah semua, mereka selalu dapat collect()
Stream sendiri:
Stream<T> deriveSomethingMeaningfulFromPrivateState() {
return myPrivateThingies.stream()
.map(this::ownerOfthing)
.map(Owner::socialStatus)
.filter(SocialStatus::isHeAFineMatey);
// No collect
}
Pendekatan ini menggoda bagi saya untuk mencoba karena saya tidak melihat adanya kelemahan yang mungkin terjadi. Namun, saya belum pernah melihat pendekatan ini di perpustakaan mana pun (mungkin karena tidak ada banyak perpustakaan yang dirilis setelah munculnya Java 8), jadi saya agak takut untuk mengadopsinya. Kelas perpustakaan yang ada biasanya mengembalikan Koleksi ketika mereka memperoleh sesuatu dari negara bagian.
Adakah sesuatu yang buruk yang dapat terjadi jika saya memutuskan untuk mengembalikan Stream di mana diri saya pra-Jawa-8 akan mengembalikan Koleksi? Atau mungkin saya melakukan sesuatu yang anti-internet di sini dengan semua yang berasal dari negara swasta?