Saya mencoba menggunakan Java 8 Stream
s untuk menemukan elemen dalam aLinkedList
. Namun saya ingin menjamin bahwa hanya ada satu dan hanya satu yang cocok dengan kriteria filter.
Ambil kode ini:
public static void main(String[] args) {
LinkedList<User> users = new LinkedList<>();
users.add(new User(1, "User1"));
users.add(new User(2, "User2"));
users.add(new User(3, "User3"));
User match = users.stream().filter((user) -> user.getId() == 1).findAny().get();
System.out.println(match.toString());
}
static class User {
@Override
public String toString() {
return id + " - " + username;
}
int id;
String username;
public User() {
}
public User(int id, String username) {
this.id = id;
this.username = username;
}
public void setUsername(String username) {
this.username = username;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public int getId() {
return id;
}
}
Kode ini menemukan User
berdasarkan ID mereka. Tetapi tidak ada jaminan berapa banyakUser
yang cocok dengan filter.
Mengubah garis filter ke:
User match = users.stream().filter((user) -> user.getId() < 0).findAny().get();
Akan melempar NoSuchElementException
(bagus!)
Saya ingin melontarkan kesalahan jika ada beberapa pertandingan. Apakah ada cara untuk melakukan ini?
Stream::size
?
Stream
jauh lebih banyak daripada yang saya lakukan sebelumnya ...
LinkedHashSet
(dengan asumsi Anda ingin agar penyisipan dipertahankan) atau HashSet
semuanya. Jika koleksi Anda hanya digunakan untuk menemukan id pengguna tunggal, lalu mengapa Anda mengumpulkan semua item lainnya? Jika ada potensi bahwa Anda akan selalu perlu menemukan beberapa id pengguna yang juga perlu unik, lalu mengapa menggunakan daftar dan bukan set? Anda memprogram mundur. Gunakan koleksi yang tepat untuk pekerjaan itu dan selamatkan diri Anda dari sakit kepala ini
count()
adalah operasi terminal sehingga Anda tidak dapat melakukan itu. Aliran tidak dapat digunakan setelah.