Подтвердить что ты не робот

Найти все индексы элемента в списке с помощью API потока

Я пытаюсь выполнить последовательный поиск с использованием потоков Java 8 и лямбда-выражений. Вот мой код

List<Integer> list = Arrays.asList(10, 6, 16, 46, 5, 16, 7);
int search = 16;
list.stream().filter(p -> p == search).forEachOrdered(e -> System.out.println(list.indexOf(e)));
Output: 2
        2

Я знаю, что list.indexOf(e) всегда печатает индекс первого вхождения. Как распечатать все индексы?

4b9b3361

Ответ 1

Для начала использование Lambdas не является решением всех проблем... но даже тогда, как цикл for, вы должны написать его:

List<Integer> results = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
    if (search == list.get(i).intValue()) {
        // found value at index i
        results.add(i);
    }
}

Теперь нет ничего плохого в этом, но обратите внимание, что здесь критический аспект - это индекс, а не значение. Индекс - это вход и вывод "петли".

Как поток::

List<Integer> list = Arrays.asList(10, 6, 16, 46, 5, 16, 7);
int search = 16;
int[] indices = IntStream.range(0, list.size())
                .filter(i -> list.get(i) == search)
                .toArray();
System.out.printf("Found %d at indices %s%n", search, Arrays.toString(indices));

Производит вывод:

Found 16 at indices [2, 5]