Есть несколько способов сделать это, в зависимости от ваших точных требований:
Индексы
Конечно, вы можете создать IntStream
, содержащий все индексы данного массива:
IntStream.range(0, arr.length)
Затем вы можете проверить, равен ли элемент в данной позиции element
:
.filter(i -> arr[i] == element)
Мы можем прервать ходьбу, если найдем любой элемент массива, равный element
:
.findAny()
Возвращает OptionalInt
, который содержит первый индекс найденного элемента. OptionalInt
предназначен для того, чтобы содержать либо значение, либо нет. Это лучше, чем использование значения часового (например, -1
).
Затем вы можете выполнить определенное действие, если найдено значение:
.ifPresent(i -> System.out.println("Element " + element + " found at index " + i))
Поток над элементами без использования индекса
Если вас не интересует фактический индекс, вы также можете напрямую передавать массив. Класс Arrays
в пакете java.util
предоставляет метод для потоковой передачи int[]
, возвращая IntStream, который является потоком, предназначенным для потоковой передачи источника int
s.
Arrays.stream(arr)
.filter(t -> t == element)
.findAny()
.ifPresent(t -> ...);
Подробнее о потоках
Элементы потока лениво расходуются. Это означает, что поток завершается, если для достижения конечного результата используется достаточно элементов Например, Arrays.stream(arr).findAny()
касается только первого элемента arr
. Можно сказать, что findAny()
похож на if (found) { break; }
по своему действию.
Обратите внимание, что вы на самом деле используете лямбда-выражение . Это новая языковая конструкция, представленная в Java 8. forEach
- это не более чем метод, принимающий Consumer
, который, в свою очередь, является функциональным интерфейсом . Вы можете только получить доступ к переменным, которые final
или фактически являются окончательными . Метод forEach
отличается от цикла for
, поэтому вы не можете использовать break
.