0

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()" ?

enter image description here

with Most sincere thanks.

0 Answers0