Как создать 2D (двумерный) массив из Stream of Stream в Java? - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть Iterator из Iterator, из которого я хочу создать 2D-массив. У меня есть следующий код:

StreamSupport.stream(Spliterators.spliteratorUnknownSize(rowIterator, Spliterator.ORDERED), false)
        .map((Row row) -> {
            Iterator<Cell> cellIterator = row.cellIterator();
            return StreamSupport.stream(Spliterators.spliteratorUnknownSize(cellIterator, Spliterator.ORDERED), false)
                    .map(Utils::genericCellMapper)
                    .toArray();
        })
        .toArray(Object[][]::new);

Но редактор Eclipse выдает ошибку компиляции: Cannot infer type argument(s) for <R> map(Function<? super T,? extends R>).

Если я изменю код выше как:

StreamSupport.stream(Spliterators.spliteratorUnknownSize(rowIterator, Spliterator.ORDERED), false)
        .map(new Function<Row, Object[]>() {

            @Override
            public Object[] apply(Row row) {
                Iterator<Cell> cellIterator = row.cellIterator();
                List<Object> list = StreamSupport.stream(Spliterators.spliteratorUnknownSize(cellIterator, Spliterator.ORDERED), false)
                        .map(Utils::genericCellMapper)
                        .collect(Collectors.<Object>toList());

                return list.toArray(new Object[list.size()]);
            }
        })
        .toArray(Object[][]::new);

Это работает. Насколько я понимаю, в первом варианте компилятор не может определить тип возвращаемого значения преобразователя. Нужно ли использовать второй вариант для достижения требования или это проблема с Eclipse?


Аналогичный вопрос из других тем SO

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...