Я намагаюся використовувати Java 8 Streams, щоб знайти елементи в 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()це термінальна операція, тому ви не можете цього робити. Потік не можна використовувати після.