Автор оригинала: Fatos Morina.
1. Обзор
Java 8 Потоки не коллекции и элементы не могут быть доступны с помощью своих индексов, но Есть еще несколько трюков, чтобы сделать это возможным.
В этой короткой статье, мы будем смотреть на то, как итерировать в течение Поток с помощью IntStream, StreamUtils, EntryStream, и Вавр ‘ы Поток .
2. Использование простой Java
Мы можем перемещаться по Поток с помощью Интегер диапазона, а также извлечь выгоду из того факта, что оригинальные элементы находятся в массиве или коллекции, доступной по индексам.
Давайте реализуем метод, который итерирует с индексами и демонстрирует этот подход.
Проще говоря, мы хотим получить массив Струны и выбирают только даже индексные элементы:
public ListgetEvenIndexedStrings(String[] names) { List evenIndexedNames = IntStream .range(0, names.length) .filter(i -> i % 2 == 0) .mapToObj(i -> names[i]) .collect(Collectors.toList()); return evenIndexedNames; }
Давайте теперь проверить реализации:
@Test public void whenCalled_thenReturnListOfEvenIndexedStrings() { String[] names = {"Afrim", "Bashkim", "Besim", "Lulzim", "Durim", "Shpetim"}; ListexpectedResult = Arrays.asList("Afrim", "Besim", "Durim"); List actualResult = StreamIndices.getEvenIndexedStrings(names); assertEquals(expectedResult, actualResult); }
3. Использование StreamUtils
Другой способ итерировать с индексами можно сделать с помощью zipWithIndex () метод СтримУтилс из протон-пакет библиотека (последняя версия можно найти здесь ).
Во-первых, вы должны добавить его в свой пом.xml :
com.codepoetics protonpack 1.13
Теперь давайте посмотрим на код:
public List> getEvenIndexedStrings(List names) { List > list = StreamUtils .zipWithIndex(names.stream()) .filter(i -> i.getIndex() % 2 == 0) .collect(Collectors.toList()); return list; }
Следующие тесты этого метода и успешно проходит:
@Test public void whenCalled_thenReturnListOfEvenIndexedStrings() { Listnames = Arrays.asList( "Afrim", "Bashkim", "Besim", "Lulzim", "Durim", "Shpetim"); List > expectedResult = Arrays.asList( Indexed.index(0, "Afrim"), Indexed.index(2, "Besim"), Indexed.index(4, "Durim")); List > actualResult = StreamIndices.getEvenIndexedStrings(names); assertEquals(expectedResult, actualResult); }
4. Использование StreamEx
Мы также можем итерировать с индексами, используя filterKeyValue () ВходСтрим класс из StreamEx библиотека (последняя версия можно найти здесь ). Во-первых, мы должны добавить его в нашу пом.xml:
one.util streamex 0.6.5
Давайте посмотрим простое применение этого метода, используя наш предыдущий пример:
public ListgetEvenIndexedStringsVersionTwo(List names) { return EntryStream.of(names) .filterKeyValue((index, name) -> index % 2 == 0) .values() .toList(); }
Мы будем использовать аналогичный тест, чтобы проверить это:
@Test public void whenCalled_thenReturnListOfEvenIndexedStringsVersionTwo() { String[] names = {"Afrim", "Bashkim", "Besim", "Lulzim", "Durim", "Shpetim"}; ListexpectedResult = Arrays.asList("Afrim", "Besim", "Durim"); List actualResult = StreamIndices.getEvenIndexedStrings(names); assertEquals(expectedResult, actualResult); }
5. Итерация с использованием потока Вавра
Другим вероятным способом итерации является использование zipWithIndex () метод Вавр (ранее известный как Явасланг ) в Поток реализация:
public ListgetOddIndexedStringsVersionTwo(String[] names) { return Stream .of(names) .zipWithIndex() .filter(tuple -> tuple._2 % 2 == 1) .map(tuple -> tuple._1) .toJavaList(); }
Мы можем протестировать этот пример следующим методом:
@Test public void whenCalled_thenReturnListOfOddStringsVersionTwo() { String[] names = {"Afrim", "Bashkim", "Besim", "Lulzim", "Durim", "Shpetim"}; ListexpectedResult = Arrays.asList("Bashkim", "Lulzim", "Shpetim"); List actualResult = StreamIndices.getOddIndexedStringsVersionTwo(names); assertEquals(expectedResult, actualResult); }
Если вы хотите узнать больше о Vavr, проверьте эту статью.
6. Заключение
В этом быстром учебнике мы увидели четыре подхода о том, как итерировать через потоки с помощью индексов. Потоки получили много внимания и возможность также итерировать через них с индексами может быть полезным.
Есть много функций, которые включены в Java 8 Streams, некоторые из которых уже охвачены на Baeldung .
Код для всех примеров, объясненных здесь, и многое другое можно найти более на GitHub .