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 []?
Ответы
Ответ 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()