java8 stream apis, выбрасывающий несовместимые типы: Object [] не может быть преобразован в Integer [] при преобразовании массива String в массив Integer - PullRequest
0 голосов
/ 20 февраля 2019

Мои коды ниже:

String[] valStrs=data.split(";");//data is a string
Integer[] vals=Arrays.stream(valStrs).map(Integer::valueOf).toArray();

выбрасывает:

error: incompatible types: Object[] cannot be converted to Integer[] [in Codec.java]
        Integer[] vals=Arrays.stream(valStrs).map(Integer::valueOf).toArray();

Я думаю, что я пытаюсь получить поток String, затем сопоставить String в Integerна Integer::valueOf и собрать эти Integer в массив.

Так почему эта ошибка?Сделал быстрый поиск и не может найти ответ.


ОБНОВЛЕНИЕ:

С тем, что int[] arr= Arrays.stream(valStrs).mapToInt(Integer::parseInt).toArray(); работает отлично.

1 Ответ

0 голосов
/ 20 февраля 2019

Вы должны передать ссылку на конструктор целочисленного массива в toArray следующим образом.В противном случае он создаст Object[] по умолчанию.

Arrays.stream(valStrs).map(Integer::valueOf).toArray(Integer[]::new);

mapToInt создает IntStream, а его функция toArray() возвращает int[].Вот объявление.

int[] toArray();

И наоборот, map(Integer::valueOf) создает Stream<Integer>, а toArray возвращает Object[], если не указано иное.Вот реализация.

@Override
public final Object[] toArray() {
    return toArray(Object[]::new);
}

Вызов toArray(Integer[]::new) вызовет этот перегруженный метод.

public final <A> A[] toArray(IntFunction<A[]> generator)

Вот выдержка из документации.

Возвращает массив, содержащий элементы этого потока, используя предоставленную функцию генератора для выделения возвращаемого массива.

генератор функция, которая создает новый массив желаемого типа и предоставленной длины

...