flatMap для итератора

Даны вложенные итераторы. Нужно написать метод, который соберет все элементы данных итераторов в List.

Для преобразование итератора в стрим нужно воспользоваться методом iteratorToStream(). Для решения нужно также использовать методы flatMap() и collect().

мой код:

public class FlatIt {
    public static List<Integer> flatten(Iterator<Iterator<Integer>> it) {
        return new ArrayList<>();
    }

    private static <T> Stream<T> iteratorToStream(Iterator<T> it) {  
      return StreamSupport.stream(Spliterators.spliteratorUnknownSize(it, 0), false)
                .flatMap(it -> StreamSupport.stream(Spliterators.spliteratorUnknownSize(it, Spliterator.ORDERED), 
                false).collect(it.toList())
                .it());
    } }

мой тест:

public class FlatItTest {

    @Test
    public void whenIt() {
        Iterator<Iterator<Integer>> it = List.of(
                List.of(1).iterator(),
                List.of(2, 3).iterator()
        ).iterator();
        assertThat(
                FlatIt.flatten(it),
                is(List.of(1, 2, 3))
        );
    }
}

что нужно сделать чтобы код работал правильно?


Ответы (1 шт):

Автор решения: Danil Apsadikov
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;

public class Main {

    public static void main(String[] args) {
        Iterator<Iterator<Integer>> it = List.of(
                List.of(1, 2, 3).iterator(),
                List.of(4, 5, 6).iterator()
        ).iterator();
        List<Integer> result = flatten(it);
        System.out.println(result);
//        [1, 2, 3, 4, 5, 6]
    }

    public static List<Integer> flatten(Iterator<Iterator<Integer>> iteratorIterator) {
        return iteratorToStream(iteratorIterator).flatMap(Main::iteratorToStream).collect(Collectors.toList());
    }

    private static <T> Stream<T> iteratorToStream(Iterator<T> iterator) {
        return StreamSupport.stream(
                Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED),
                false);
    }
}
→ Ссылка