У меня есть 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