Saya mencoba untuk mengubah array int ke Daftar dan saya mengambil rute asing menggunakan Java 8 Stream dan datang dengan ini
Arrays.stream(arr).boxed().collect(Collectors.toList());
Saya masih mengalami kesulitan untuk sepenuhnya memahami kalimat ini, kebanyakan,
Mengapa
Collectors.toList()
dalam hal ini mengembalikan antarmukaArrayList<Integer>
pelaksanaList
? Mengapa tidakLinkedList<Integer>
atau kelas generik lain yang sesuai denganList
antarmuka? Saya tidak dapat menemukan apa pun tentang ini, kecuali untuk penyebutan singkat tentang ArrayList di sini , di bagian Catatan API.Apa artinya panel kiri ? Jelas adalah tipe pengembalian generik ( dalam kode saya di sini). Dan saya pikir argumen tipe generik dari metode ini, tetapi bagaimana mereka ditentukan? Saya melihat ke antarmuka antarmuka Collector dan tidak dapat menyerapnya.
Stream.collect()
R
ArrayList<Integer>
<R, A>
R
adalah tipe generik dari tipe yang dihasilkan.A
tipe generik dari tipe akumulasi menengah Kolektor. Itu adalah detail implementasi tentang cara kerja kolektor. Itu membagi dan menaklukkan, juga untuk pemrosesan paralel, mengumpulkan pertama menjadi tipe perantara.Collectors.toList()
dalam kasus ini mengembalikan sebuahArrayList<Integer>
" Itu mungkin tidak mengembalikan sebuahArrayList
. TheList
implementasi terdefinisi , sehingga Anda tidak bisa mengandalkan apa implementasi itu kembali. Seperti yang dikatakan javadoc : "Tidak ada jaminan pada jenis , mutabilitas, serializability, atau keamanan thread dari Daftar yang dikembalikan;"toList()
tidak mengembalikanArrayList
atauList
- itu mengembalikanCollector
, yang pada akhirnya akan membuat dan mengembalikanList
- juga dokumentasi menyatakan: "... Tidak ada jaminan pada jenis , mutabilitas, serializability, atau keselamatan benang dari Daftar yang dikembalikan; jika kontrol lebih besar atas Daftar yang dikembalikan diperlukan, gunakan toCollection (Pemasok) .... "Jawaban:
Ini implementasi standar.
ArrayList
digunakan, karena yang terbaik dalam kebanyakan kasus penggunaan, tetapi jika itu tidak cocok untuk Anda, Anda selalu dapat menentukan kolektor Anda sendiri dan menyediakan pabrik untuk yangCollection
Anda inginkan:Ya,
A
danR
merupakan parameter umum dari metode ini,R
adalah tipe pengembalian,T
adalah tipe input danA
merupakan tipe perantara, yang muncul di seluruh proses pengumpulan elemen (mungkin tidak terlihat dan tidak terkait fungsi ini). AwalCollector
javadoc mendefinisikan tipe-tipe tersebut (mereka konsisten di seluruh dokumen):sumber
List<Integer> myList = Arrays.stream(arr).boxed().collect(Collectors.toList());
dan memanggil hanya metode yang dideklarasikan di Daftar antarmuka pada myList. Kalau tidak, saya berpotensi menempatkan diri saya dalam risiko, jika Oracle memutuskan untuk mengubah implementasi default di Java8u1024 atau 15?List
, jadi implementasi apa pun yang digunakan, perilaku adalah sama. Sepertinya antarmuka tidak akan diubah dalam versi java yang lebih baru.Sebagai definisi metode menyarankan itu mengembalikan implementasi Kolektor dengan pemasok kolektor sebagai
ArrayList
. Oleh karena itu, sangat jelas dari definisi metode di bawah ini yangCollectors.toList
selalu mengembalikan kolektor ArrayList (While it's arguable why toList not toArrayList word is used in method name
).<R, A> R collect(Collector<? super T, A, R> collector)
artinyaJika Anda merujuk pada komentar dokumentasi, maka secara akurat menyebutkan jenis generik ini:
sumber
Collectors.toList()
(cuplikan pertama)? Apakah itu openjdk?