Подтвердить что ты не робот

Java-поток toArray() преобразуется в определенный тип массива

Возможно, это очень просто, но я на самом деле ноб на Java 8 и не знаю, как это сделать. У меня есть эта простая строка, которая содержит следующий текст:

"Ключ, имя"

и я хочу преобразовать эту строку в массив String, разделив каждое значение на запятую (,), однако я также хочу обрезать каждое поле перед возвратом окончательного массива, поэтому я сделал следующее:

Arrays.stream(line.split(",")).map(String::trim).toArray();

Однако это возвращает массив Object [], а не массив String []. При дальнейшей проверке я могу подтвердить, что содержимое на самом деле является экземплярами String, но сам массив имеет элементы Object. Позвольте мне проиллюстрировать это, это то, что отладчик говорит о возвращенном объекте:

Object[]:
    0 = (String) "Key"
    1 = (String) "Name"

Насколько я могу судить, проблема заключается в обратном типе вызова карты, но как заставить его вернуть массив String []?

4b9b3361

Ответ 1

Используйте toArray(size -> new String[size]) или toArray(String[]::new).

String[] strings = Arrays.stream(line.split(",")).map(String::trim).toArray(String[]::new);

Это фактически лямбда-выражение для

.toArray(new IntFunction<String[]>() {
        @Override
        public String[] apply(int size) {
            return new String[size];
        }
    });

Где вы говорите, чтобы преобразовать массив в массив String того же размера.

Из docs

Функция генератора принимает целое число, которое представляет собой размер требуемого массива, и создает массив требуемого размера. Это можно кратко выразить с помощью ссылки на конструктор массива:

 Person[] men = people.stream()
                      .filter(p -> p.getGender() == MALE)
                      .toArray(Person[]::new);

Параметры типа:

A - тип элемента результирующего массива

Параметры:

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

Ответ 2

String[]::new - это функция, которая вызывает псевдо-метод new для типа String[], так же как String::trim - это функция, которая вызывает реальный метод trim типа String. Значение, переданное функции String::new byArray, представляет собой размер коллекции в правой части вызова метода .toArray().

Если вы заменили String[]::new на n->new String[n], вам может быть удобнее синтаксис, как вы могли бы заменить String::trim на менее классный s->s.trim()