Java 11
Новый toArray
метод по умолчанию в Collection
интерфейсе позволяет передавать элементы коллекции во вновь созданный массив требуемого типа времени выполнения. Он принимает в IntFunction<T[]> generator
качестве аргумента и может использоваться как:
String[] array = set.toArray(String[]::new);
Подобный метод уже существует, Collection.toArray(T[])
и это добавление означает, что мы больше не можем передавать его в null
качестве аргумента, поскольку в этом случае ссылка на метод будет неоднозначной. Но это все еще хорошо, так как оба метода бросают NPE в любом случае.
Java 8
В Java 8 мы можем использовать потоковый API:
String[] array = set.stream().toArray(String[]::new);
Мы также можем использовать перегруженную версию toArray (), которая принимает IntFunction<A[]> generator
:
String[] array = set.stream().toArray(n -> new String[n]);
Цель функции генератора здесь состоит в том, чтобы взять целое число (размер желаемого массива) и создать массив желаемого размера. Я лично предпочитаю первый подход, использующий ссылку на метод, чем более поздний, использующий лямбда-выражение.
toArray()
метода, который четко упоминается в Javadoc.