Как использовать FlatMap для Iterator?
Дан пример как flatMap ведет себя в stream API:
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class FlatMap {
public static void main(String[] args) {
List<List<Integer>> data = List.of(
List.of(1, 2, 3),
List.of(4, 5, 6),
List.of(7, 8, 9)
);
List<Integer> flat =
data.stream()
.flatMap(List::stream)
.collect(Collectors.toList());
System.out.println(flat);
}
}
Эта пример как ведет себя flatmap, в задании нужно создать подобное поведение.
Сама задача :
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.Collections;
public class FlatMap<T> implements Iterator<T> {
private final Iterator<Iterator<T>> data;
private Iterator<T> cursor = Collections.emptyIterator();
public FlatMap(Iterator<Iterator<T>> data) {
this.data = data;
}
@Override
public boolean hasNext() {
return false;
}
@Override
public T next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
return cursor.next();
}
public static void main(String[] args) {
Iterator<Iterator<Integer>> data = List.of(
List.of(1, 2, 3).iterator(),
List.of(4, 5, 6).iterator(),
List.of(7, 8, 9).iterator()
).iterator();
FlatMap<Integer> flat = new FlatMap<>(data);
while (flat.hasNext()) {
System.out.println(flat.next());
}
}
}
И Тесты на нее :
import static org.junit.Assert.assertThat;
import static org.hamcrest.Matchers.is;
import org.junit.Test;
import java.util.Iterator;
import java.util.List;
import java.util.NoSuchElementException;
public class FlatMapTest {
@Test
public void whenDiffNext() {
Iterator<Iterator<Integer>> data = List.of(
List.of(1).iterator(),
List.of(2, 3).iterator()
).iterator();
FlatMap<Integer> flat = new FlatMap<>(data);
assertThat(flat.next(), is(1));
assertThat(flat.next(), is(2));
assertThat(flat.next(), is(3));
}
@Test
public void whenSeqNext() {
Iterator<Iterator<Integer>> data = List.of(
List.of(1, 2, 3).iterator()
).iterator();
FlatMap<Integer> flat = new FlatMap<>(data);
assertThat(flat.next(), is(1));
assertThat(flat.next(), is(2));
assertThat(flat.next(), is(3));
}
@Test
public void whenMultiHasNext() {
Iterator<Iterator<Integer>> data = List.of(
List.of(1).iterator()
).iterator();
FlatMap<Integer> flat = new FlatMap<>(data);
assertThat(flat.hasNext(), is(true));
assertThat(flat.hasNext(), is(true));
}
@Test
public void whenHasNextFalse() {
Iterator<Iterator<Integer>> data = List.of(
List.of(1).iterator()
).iterator();
FlatMap<Integer> flat = new FlatMap<>(data);
assertThat(flat.next(), is(1));
assertThat(flat.hasNext(), is(false));
}
@Test(expected = NoSuchElementException.class)
public void whenEmpty() {
Iterator<Iterator<Object>> data = List.of(
List.of().iterator()
).iterator();
FlatMap<Object> flat = new FlatMap<>(data);
flat.next();
}
@Test
public void whenSeveralEmptyAndNotEmpty() {
Iterator<Iterator<?>> it = List.of(
List.of().iterator(),
List.of().iterator(),
List.of().iterator(),
List.of(1).iterator()
).iterator();
FlatMap flat = new FlatMap(it);
assertTrue(flat.hasNext());
assertThat(1, is(flat.next()));
}
@Test
public void whenSeveralEmptyThenReturnFalse() {
Iterator<Iterator<Object>> it = List.of(
List.of().iterator(),
List.of().iterator(),
List.of().iterator(),
List.of().iterator()
).iterator();
FlatMap flat = new FlatMap(it);
assertFalse(flat.hasNext());
}
}
Задание:
- Допишите методы next и hasNext.
Помогите разобраться!!!!
Зачем они показали пример с flatMap co stream ???