Как проверить, есть ли элемент в списке
Короткий ответ
contains() возвращает true, если элемент есть в списке:
void main() {
var fruits = List.of("apple", "banana", "cherry");
IO.println(fruits.contains("banana"));
IO.println(fruits.contains("mango"));
}Результат:
true
falseПозиция
indexOf() возвращает индекс первого вхождения или -1:
void main() {
var fruits = List.of("apple", "banana", "cherry");
IO.println(fruits.indexOf("cherry"));
}Результат:
2По условию
Для поиска по полю объекта используйте anyMatch():
record User(String name, boolean admin) {}
void main() {
var users = List.of(new User("Anna", false), new User("Oleg", true));
IO.println(users.stream().anyMatch(User::admin));
}Результат:
trueМного проверок
contains() у списка просматривает все элементы. Если проверок много, сложите элементы в HashSet — его поиск почти мгновенный:
void main() {
var banned = new HashSet<>(List.of("spam@x.com", "bot@y.com"));
var emails = List.of("anna@site.com", "bot@y.com");
for (String email : emails) {
IO.println(email + " " + (banned.contains(email) ? "blocked" : "ok"));
}
}Результат:
anna@site.com ok
bot@y.com blockedЧастая ошибка
Искать объект своего класса без equals(). Обычный класс сравнивает ссылки, поэтому одинаковый по содержимому объект не находится. Записи (record) сравнивают поля автоматически:
class PointClass {
int x;
PointClass(int x) { this.x = x; }
}
record PointRecord(int x) {}
void main() {
IO.println(List.of(new PointClass(1)).contains(new PointClass(1)));
IO.println(List.of(new PointRecord(1)).contains(new PointRecord(1)));
}Результат:
false
trueФункции из этого ответа
- List.contains() — Проверяет, есть ли элемент в списке.
- List.indexOf() — Находит позицию элемента в списке.
- Stream.anyMatch() — Проверяет, подходит ли под условие хотя бы один элемент.
- HashSet — Множество без повторов на основе хеш-таблицы; порядок не гарантирован.