Я пытаюсь использовать 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
s соответствует фильтру.
Изменение строки фильтра на:
User match = users.stream().filter((user) -> user.getId() < 0).findAny().get();
Будет бросать NoSuchElementException
(хорошо!)
Я хотел бы, чтобы он выдавал ошибку, если есть несколько совпадений. Есть ли способ сделать это?
Stream::size
?
Stream
гораздо больше, чем я делал раньше ...
LinkedHashSet
(при условии, что вы хотите сохранить порядок вставки) или HashSet
все время. Если ваша коллекция используется только для поиска одного идентификатора пользователя, то почему вы собираете все остальные предметы? Если есть вероятность, что вам всегда нужно будет найти какой-то идентификатор пользователя, который также должен быть уникальным, тогда зачем использовать список, а не набор? Вы программируете в обратном направлении. Используйте правильную коллекцию для работы и
count()
это терминальная операция, поэтому вы не можете этого сделать. Поток не может быть использован после.