Как я могу получить индекс элемента внутри потоков Java?

У меня есть код, который выглядит следующим образом:

Arrays.stream(myArray).forEach(item -> System.out.println(item));

Есть ли у потоков в Java возможность получить индекс текущего элемента, который я могу использовать внутри лямбда-выражения?

Например, в JavaScript у нас есть такой код, который может дать нам индекс:

myArray.forEach((index, item) => console.log(`${index} ${item}`));

Есть ли у нас эквивалент в Java?


person M.barg    schedule 26.06.2020    source источник
comment
Отвечает ли это на ваш вопрос? Получить индекс при переборе списка с потоком   -  person Bashir    schedule 26.06.2020
comment
Вы можете проверить это stackoverflow.com/questions/18552005/   -  person Harmandeep Singh Kalsi    schedule 26.06.2020
comment
Отвечает ли это на ваш вопрос? Есть ли краткий способ перебора потока с индексами в Java 8?   -  person mohammedkhan    schedule 26.06.2020


Ответы (2)


Да, чтобы ответить на ваш вопрос, в Java вы можете перебирать поток с индексами.

Это очень простой базовый код, который показывает, как получить индекс:

import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {

        String[] array = { "Goat", "Cat", "Dog", "Crow", "Snake" }; 
        
        IntStream.range(0, array.length)
                 .mapToObj(index -> String.format("%d -> %s", index, array[index]))
                 .forEach(System.out::println); 
                 
    }
    
}

Выход :

0 -> Goat                                                                                                                                                  
1 -> Cat                                                                                                                                                   
2 -> Dog                                                                                                                                                   
3 -> Crow                                                                                                                                                  
4 -> Snake
person Som    schedule 26.06.2020

Ты можешь сделать:

Arrays.stream(array).forEach(item -> 
        System.out.println(item + " " + Arrays.asList(array).indexOf(item)));

Обновить

Если у вас есть повторяющиеся элементы, одним из вариантов является использование AtomicInteger:

AtomicInteger index = new AtomicInteger(0);
Arrays.stream(array).forEach(item -> 
    System.out.println(item + " " + index.getAndIncrement()));

Если вам разрешено использовать Guava, вы можете сделать:

Streams.mapWithIndex(Arrays.stream(array),
        (item, index) -> item + " " + index)
        .forEach(System.out::println);
person Oboe    schedule 26.06.2020
comment
Что произойдет, если в массиве есть повторяющиеся элементы? - person Federico klez Culloca; 26.06.2020
comment
@Federico klez Culloca, из List javadoc: возвращает наименьший индекс i, такой что Objects.equals(o, get(i)). - person Oboe; 26.06.2020
comment
Позвольте мне перефразировать: что происходит с вашим кодом, когда появляется дубликат? Я пытаюсь указать, что ваш код не принимает это во внимание и будет вести себя непоследовательно (т. е. в какой-то момент вы получите неправильные индексы). - person Federico klez Culloca; 27.06.2020
comment
@Federico klez Culloca, если у вас есть повторяющиеся элементы, один из вариантов — использовать AtomicInteger. Я обновил ответ, чтобы включить эту альтернативу. - person Oboe; 27.06.2020
comment
@Federico klez Culloca, если вам разрешено использовать гуаву, вы можете сделатьStreams.mapWithIndex. Смотрите обновление ответа. - person Oboe; 27.06.2020