Я намагаюся використовувати Java 8 Stream
s, щоб знайти елементи в LinkedList
. Хочу, однак, гарантувати, що є одна і одна відповідність критеріям фільтра.
Візьміть цей код:
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;
}
}
Цей код визначається User
на основі їх ідентифікатора. Але немає гарантій, скільки User
с зійшло на фільтр.
Зміна лінії фільтра на:
User match = users.stream().filter((user) -> user.getId() < 0).findAny().get();
Викине NoSuchElementException
(добре!)
Я хотів би, щоб це призвело до помилки, якщо є кілька матчів. Чи є спосіб це зробити?
Stream::size
?
Stream
набагато більше, ніж я робив раніше ...
LinkedHashSet
(припускаючи, що ви хочете зберегти порядок вставки) або HashSet
все це. Якщо ваша колекція використовується лише для пошуку одного ідентифікатора користувача, то чому ви збираєте всі інші елементи? Якщо є потенціал, що вам завжди потрібно буде знайти якийсь ідентифікатор користувача, який також повинен бути унікальним, то навіщо використовувати список, а не набір? Ви програмуєте назад. Скористайтеся правильною колекцією для роботи та врятуйте себе від цього головного болю
count()
це термінальна операція, тому ви не можете цього робити. Потік не можна використовувати після.