Для примитивных массивов
Начиная с Java 8, универсальное решение для примитивного массива arr
и значение для поиска val
:
public static int indexOf(char[] arr, char val) {
return IntStream.range(0, arr.length).filter(i -> arr[i] == val).findFirst().orElse(-1);
}
Этот код создает поток по индексам массива с помощью IntStream.range
, фильтрует индексы , чтобы сохранить только те, где элемент массива с этим индексом равен значению искал и, наконец, сохранил первое совпадение с findFirst
. findFirst
возвращает OptionalInt
, так как возможно, что соответствующие индексы не были найдены. Поэтому мы вызываем orElse(-1)
, чтобы либо вернуть найденное значение, либо -1
, если ничего не было найдено.
Перегрузки могут быть добавлены для int[]
, long[]
и т. Д. Тело метода останется прежним.
Для массивов объектов
Для объектных массивов, таких как String[]
, мы могли бы использовать ту же идею и выполнить шаг фильтрации, используя метод equals
или Objects.equals
, чтобы рассмотреть два null
элементов равны, вместо ==
.
Но мы можем сделать это проще:
public static <T> int indexOf(T[] arr, T val) {
return Arrays.asList(arr).indexOf(val);
}
Это создает оболочку списка для входного массива с использованием Arrays.asList
и поиск индекса элемента с помощью indexOf
.
Это решение не работает для примитивных массивов, , как показано здесь : примитивный массив, такой как int[]
, не является Object[]
, а Object
; таким образом, вызов asList
создает для него список из одного элемента, который является заданным массивом, а не списком элементов массива.