Java IntStream iterate vs menghasilkan kapan harus menggunakan apa?

19

Tampaknya IntStream.iterateini hanya versi ringan yang dipesan untuk IntStream.generate. Apakah itu benar Jika tidak, apa perbedaan intinya?

JJ Beam
sumber

Jawaban:

21

Perhatikan bagaimana tanda tangannya berbeda:

  • generatemengambil IntSupplier, yang berarti bahwa Anda seharusnya menghasilkan int tanpa diberi apa pun. Contoh penggunaan termasuk membuat aliran konstan dari bilangan bulat yang sama, membuat aliran bilangan bulat acak. Perhatikan bagaimana setiap elemen dalam aliran tidak bergantung pada elemen sebelumnya.

  • iteratemengambil a seeddan a IntUnaryOperator, yang berarti bahwa Anda diharapkan untuk menghasilkan setiap elemen berdasarkan elemen sebelumnya . Ini berguna untuk membuat urutan yang didefinisikan secara induktif, misalnya. Dalam hal ini, setiap elemen seharusnya bergantung pada yang sebelumnya .

Penyapu
sumber
Jadi gunakan kasus iterate - ketika perlu menyelamatkan negara - ini adalah perbedaan inti. Hasilkan kebutuhan untuk menyimpan status di tempat lain. Dan Iterate dipesan, sedangkan generate tidak teratur yang layak untuk parralelisme
JJ Beam
8
  1. IntStream.iteratemengembalikan yang dipesanIntStream di sisi lain IntStream.generatemengembalikan yang tidak berurutanIntStream yang dapat membantu mempercepat pipa aliran paralel.

  2. IntStream.generate lebih disukai untuk menghasilkan nilai acak atau konstan seperti yang ditentukan dalam Javadoc, saya kira kemungkinan besar untuk karakteristik aliran dikembalikan.

Naman
sumber
5

Selain pesanan, penggunaannya juga agak berbeda. Mari kita lihat tanda tangan metode:

  • iterate(int seed, IntUnaryOperator f)
  • generate(IntSupplier s)

Iterate secara eksplisit telah memberikan nilai awal sebagai parameter dan operator unary yang digunakan untuk menghasilkan nilai berikutnya dari sebelumnya. Di sini operator dapat dengan mudah berubah tanpa kondisi internal dan dapat digunakan kembali di banyak tempat secara paralel tanpa masalah.

Hasilkan menggunakan pemasok. Mereka dapat memberikan angka konstan atau acak atau perlu memiliki keadaan internal untuk menyediakan seri seperti (1, 2, 3, ...).

n1t4chi
sumber