it-swarm.com.ru

Java stream toArray () преобразовать в определенный тип массива

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

"Ключ, Имя"

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

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

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

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

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

58
arielnmz

Используйте 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 того же размера.

Из документов

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

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

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

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

Параметры:

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

100
Mritunjay

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

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

4
Paul Buis