Saya dapat menggunakan new List(Collection2.filter())
tentu saja, tetapi dengan cara ini tidak ada jaminan bahwa pemesanan saya tetap sama.
Ini tidak benar. Collections2.filter()
adalah fungsi yang dievaluasi dengan lambat - fungsi ini tidak benar-benar memfilter koleksi Anda sampai Anda mulai mengakses versi yang difilter. Misalnya, jika Anda mengulang versi yang difilter, elemen yang difilter akan keluar dari iterator dengan urutan yang sama seperti koleksi asli Anda (kecuali yang difilter, tentunya).
Mungkin Anda berpikir bahwa ia melakukan pemfilteran di depan, lalu membuang hasilnya ke dalam bentuk Koleksi yang sewenang-wenang dan tidak berurutan - ternyata tidak.
Jadi jika Anda menggunakan keluaran dari Collections2.filter()
sebagai masukan ke daftar baru, maka pesanan asli Anda akan dipertahankan.
Menggunakan impor statis (dan Lists.newArrayList
fungsinya), ini menjadi cukup singkat:
List filteredList = newArrayList(filter(originalList, predicate));
Perhatikan bahwa sementara Collections2.filter
tidak akan bersemangat mengulang koleksi yang mendasarinya, Lists.newArrayList
akan - itu akan mengekstrak semua elemen dari koleksi yang difilter dan menyalinnya ke yang baru ArrayList
.