Однострочник для проверки наличия элемента в списке
У меня есть опыт работы с Java и Python, но сейчас мне нужно проверить, содержится ли элемент в списке и выполнить некоторые действия.
В Python это выглядит следующим образом:
if "a" in ["a", "b", "c"]:
print("It's there!")
Есть ли в Java какой-то аналогичный однострочный способ, чтобы сделать то же самое, без необходимости создавать ArrayList
, Set
или другую подобную структуру данных и добавлять элементы в нее поэтапно?
Спасибо!
5 ответ(ов)
В JDK 7 такая конструкция не поддерживается, так как в Java нет поддержки литералов коллекций. Поэтому ваш код не будет компилироваться.
Однако, если бы проект Project Coin, включавший литералы для коллекций, был реализован, то правильный синтаксис для проверки наличия элемента в массиве выглядел бы так:
if (Arrays.asList("a", "b", "c").contains("a")) {
// Ваш код
}
В этом примере используется метод Arrays.asList
, который преобразует массив строк в список, после чего вы можете использовать метод contains
для проверки наличия элемента.
Редактирование: К сожалению, проект так и не был реализован, и литералы коллекций не были добавлены в язык. Поэтому вам все еще придется использовать Arrays.asList
или другие подходы для проверки наличия элементов в коллекциях.
Вы можете попробовать использовать строки с разделителем, который не появляется ни в одном из элементов. Например, можно проверить, содержится ли подстрока в строке, как показано ниже:
if ("|a|b|c|".contains("|a|")) {
// Ваш код тут
}
Этот подход позволяет легко разделять элементы и проверять, содержится ли нужный элемент в строке. Убедитесь, что выбранный разделитель уникален и не встречается внутри элементов.
Я бы использовал:
if (Stream.of("a", "b", "c").anyMatch("a"::equals)) {
// Код для выполнения
}
или:
Stream.of("a", "b", "c")
.filter("a"::equals)
.findAny()
.ifPresent(ignore -> /* Код для выполнения */);
Оба варианта позволяют проверить, есть ли элемент "a" в этом стриме. Первый вариант более лаконичен, но второй может быть предпочтителен, если вы хотите выполнить код только при наличии элемента, и при этом можете дополнительно использовать результат, который возвращает filter
. Выбор зависит от ваших предпочтений и конкретного контекста задачи.
Если он действительно хочет однострочник без использования коллекций, то вот такой вариант:
for (String s : new String[]{"a", "b", "c"}) if (s.equals("a")) System.out.println("Это есть");
улыбка
(Неужели это некрасиво? Пожалуйста, не используйте это в реальном коде)
Вы можете использовать java.util.Arrays.binarySearch
, чтобы найти элемент в массиве или проверить его наличие:
import java.util.Arrays;
...
char[] array = new char[] {'a', 'x', 'm'};
Arrays.sort(array);
if (Arrays.binarySearch(array, 'm') >= 0) {
System.out.println("Да, 'm' присутствует");
}
Обратите внимание, что для корректной работы binarySearch
массив должен быть отсортирован. Именно поэтому в примере вызывается Arrays.sort()
. Если ваши данные уже отсортированы, вам не нужно этого делать. Таким образом, это не совсем однострочное решение, если вам нужно сначала отсортировать массив. К сожалению, метод Arrays.sort()
не возвращает ссылку на массив, следовательно, вы не можете объединить сортировку и поиск (то есть Arrays.binarySearch(Arrays.sort(myArray), ключ)
не сработает).
Если вы можете позволить себе дополнительное выделение памяти, использование Arrays.asList()
выглядит более аккуратно.
Инициализация ArrayList в одну строчку
Почему нет ConcurrentHashSet, если есть ConcurrentHashMap?
Что такое «сырые типы» и почему их не следует использовать?
Создание репозитория Spring без сущности
Как сгенерировать уникальный хеш-код для строкового ввода в Android?