Di perpustakaan pra-Java 8 lambda-berat seperti Guava, output menggunakan antarmuka Java Collection Framework umum sehingga mudah untuk menyebarkannya ke API eksternal / internal dan masih memanfaatkan beberapa perhitungan malas jika metode perpustakaan melakukannya (misalnya malas filter()
dan transform()
).
Namun, di Java 8 Streams, panggilan untuk mendapatkan terminal a Collection
/ Map
is (yaitu bersemangat) dan itu juga akan mengalokasikan struktur data baru untuk menyimpan hasilnya.
Untuk perhitungan yang rumit dengan beberapa tahapan dan pola strategi di tengah, ini menyebabkan banyak alokasi yang tidak perlu karena hasil antara.
Jadi, apakah orang berpikir itu adalah praktik yang baik untuk API internal (yaitu strategi pola strategi) untuk mengambil dan kembali Stream
atau haruskah saya mundur ke malas tetapi tidak dirampingkan (pun intended saya kira) API Guava?
Edit:
Perhatian utama saya Stream
adalah bahwa itu hanya dapat dikonsumsi sekali dan melewati sesuatu seperti Supplier<Stream<X>>
terlihat sangat rumit. Hampir mendorong Anda hanya untuk lulus Collection
dan kemudian kembali stream()
(dan membayar biaya evaluasi bersemangat pada saat itu).
Jawaban:
Kemalasan di Java 8 Streaming bekerja sama seperti dulu untuk Iterables di Jambu: Anda harus meneruskan Iterable untuk tetap malas dan evaluasi terjadi, setelah Anda membangun Koleksi dari Iterator. Baik Streaming dan Iterator hanya dapat dikonsumsi sekali.
Jadi untuk antarmuka metode Anda, cara yang lebih umum (mengizinkan kemalasan) adalah dengan menggunakan antarmuka Stream (setiap kali Anda akan menggunakan Iterable sebelumnya). Seperti yang dikatakan @Philipp, ini memungkinkan mereka untuk digunakan dalam aliran pipa.
Mudah-mudahan, karena Stream sekarang adalah antarmuka standar Java resmi, akan ada lebih banyak dan lebih banyak perpustakaan dan fungsi yang secara efisien dapat bekerja pada Streams secara langsung.
sumber