First, there has an Iterator:
static class ItClass implements Iterable<Integer>, Iterator<Integer> {
String[] tokens = "1,2,4,1,2,4,1,2,4".split(",");
private final Iterator<String> tokensIterator = Arrays.asList(tokens).iterator();
@Override
public boolean hasNext() {
return this.tokensIterator.hasNext();
}
@Override
public Integer next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
String token = this.tokensIterator.next();
return Integer.valueOf(token);
}
@Override
public Iterator<Integer> iterator() {
return this;
}
}
I want to flat a List of Iterator into a List like this:
@Test
public void testFlatMap() {
List<ItClass> rangeExpanderList = new ArrayList<>();
rangeExpanderList.add(new ItClass());
rangeExpanderList.add(new ItClass());
// tag 1
List<Integer> reL = rangeExpanderList.stream().map(it -> IteratorUtils.toList(it)).flatMap(List::stream).map(s -> new Integer(String.valueOf(s))).collect(Collectors.toList());
// tag 2
List<Integer> reL2 = rangeExpanderList.stream().flatMap(iterable -> StreamSupport.stream(iterable.spliterator(), false)).collect(Collectors.toList());
// tag 3
List<Integer> reL3 = rangeExpanderList.stream().flatMap(it -> IteratorUtils.toList(it).stream()).collect(Collectors.toList());
}
the "tag 1" and "tag 2" are all correct while "tag3" is incorrect.
Why the "tag 3" is incorrect?
what's the different between "StreamSupport.stream(iterable.spliterator(), false)" and "IteratorUtils.toList(it).stream()" ?
with Most sincere thanks.