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);
}
}