Java 8: Praktik yang baik untuk mengalirkan Streaming di API untuk operasi yang malas?

12

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/ Mapis (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 Streamatau haruskah saya mundur ke malas tetapi tidak dirampingkan (pun intended saya kira) API Guava?

Edit:

Perhatian utama saya Streamadalah bahwa itu hanya dapat dikonsumsi sekali dan melewati sesuatu seperti Supplier<Stream<X>>terlihat sangat rumit. Hampir mendorong Anda hanya untuk lulus Collectiondan kemudian kembali stream()(dan membayar biaya evaluasi bersemangat pada saat itu).

billc.cn
sumber
Apa, Jambu & teman tidak diperbarui untuk memanfaatkan aliran asli?
Kilian Foth
1
Memiliki antarmuka yang mengambil dan mengembalikan stream benar-benar meningkatkan interoperabilitas dengan fungsionalitas stream standar. Ini memungkinkan Anda untuk mengintegrasikan panggilan ke antarmuka Anda ke dalam pipa aliran.
Philipp
@KilianFoth Tidak ada rilis Guava selama hampir setahun dan ada banyak artikel populer tentang mengganti barang lambda Guava dengan Stream; namun tidak satu pun dari mereka yang membahas fakta bahwa operasi pengumpulan Jambu bisa bersemangat atau malas.
billc.cn

Jawaban:

3

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.

Robert Jack Will
sumber