< prev index next >

src/java.base/share/classes/java/util/Collection.java

Print this page
rev 48215 : 8060192: Add default method <A> A[] Collection.toArray(IntFunction<A[]> generator)
Reviewed-by: martin, forax, psandoz

*** 23,32 **** --- 23,33 ---- * questions. */ package java.util; + import java.util.function.IntFunction; import java.util.function.Predicate; import java.util.stream.Stream; import java.util.stream.StreamSupport; /**
*** 274,285 **** * <p>The returned array will be "safe" in that no references to it are * maintained by this collection. (In other words, this method must * allocate a new array even if this collection is backed by an array). * The caller is thus free to modify the returned array. * ! * <p>This method acts as bridge between array-based and collection-based ! * APIs. * * @return an array, whose {@linkplain Class#getComponentType runtime component * type} is {@code Object}, containing all of the elements in this collection */ Object[] toArray(); --- 275,290 ---- * <p>The returned array will be "safe" in that no references to it are * maintained by this collection. (In other words, this method must * allocate a new array even if this collection is backed by an array). * The caller is thus free to modify the returned array. * ! * @apiNote ! * This method acts as a bridge between array-based and collection-based APIs. ! * It returns an array whose runtime type is {@code Object[]}. ! * Use {@link #toArray(Object[]) toArray(T[])} to reuse an existing ! * array, or use {@link #toArray(IntFunction)} to control the runtime type ! * of the array. * * @return an array, whose {@linkplain Class#getComponentType runtime component * type} is {@code Object}, containing all of the elements in this collection */ Object[] toArray();
*** 300,322 **** * * <p>If this collection makes any guarantees as to what order its elements * are returned by its iterator, this method must return the elements in * the same order. * ! * <p>Like the {@link #toArray()} method, this method acts as bridge between ! * array-based and collection-based APIs. Further, this method allows ! * precise control over the runtime type of the output array, and may, ! * under certain circumstances, be used to save allocation costs. * * <p>Suppose {@code x} is a collection known to contain only strings. ! * The following code can be used to dump the collection into a newly ! * allocated array of {@code String}: * * <pre> ! * String[] y = x.toArray(new String[0]);</pre> * ! * Note that {@code toArray(new Object[0])} is identical in function to * {@code toArray()}. * * @param <T> the component type of the array to contain the collection * @param a the array into which the elements of this collection are to be * stored, if it is big enough; otherwise, a new array of the same --- 305,335 ---- * * <p>If this collection makes any guarantees as to what order its elements * are returned by its iterator, this method must return the elements in * the same order. * ! * @apiNote ! * This method acts as a bridge between array-based and collection-based APIs. ! * It allows an existing array to be reused under certain circumstances. ! * Use {@link #toArray()} to create an array whose runtime type is {@code Object[]}, ! * or use {@link #toArray(IntFunction)} to control the runtime type of ! * the array. * * <p>Suppose {@code x} is a collection known to contain only strings. ! * The following code can be used to dump the collection into a previously ! * allocated {@code String} array: * * <pre> ! * String[] y = new String[SIZE]; ! * ... ! * y = x.toArray(y);</pre> ! * ! * <p>The return value is reassigned to the variable {@code y}, because a ! * new array will be allocated and returned if the collection {@code x} has ! * too many elements to fit into the existing array {@code y}. * ! * <p>Note that {@code toArray(new Object[0])} is identical in function to * {@code toArray()}. * * @param <T> the component type of the array to contain the collection * @param a the array into which the elements of this collection are to be * stored, if it is big enough; otherwise, a new array of the same
*** 327,336 **** --- 340,388 ---- * runtime component type} of the specified array * @throws NullPointerException if the specified array is null */ <T> T[] toArray(T[] a); + /** + * Returns an array containing all of the elements in this collection, + * using the provided {@code generator} function to allocate the returned array. + * + * <p>If this collection makes any guarantees as to what order its elements + * are returned by its iterator, this method must return the elements in + * the same order. + * + * @apiNote + * This method acts as a bridge between array-based and collection-based APIs. + * It allows creation of an array of a particular runtime type. Use + * {@link #toArray()} to create an array whose runtime type is {@code Object[]}, + * or use {@link #toArray(Object[]) toArray(T[])} to reuse an existing array. + * + * <p>Suppose {@code x} is a collection known to contain only strings. + * The following code can be used to dump the collection into a newly + * allocated array of {@code String}: + * + * <pre> + * String[] y = x.toArray(String[]::new);</pre> + * + * @implSpec + * The default implementation calls the generator function with zero + * and then passes the resulting array to {@link #toArray(Object[]) toArray(T[])}. + * + * @param <T> the component type of the array to contain the collection + * @param generator a function which produces a new array of the desired + * type and the provided length + * @return an array containing all of the elements in this collection + * @throws ArrayStoreException if the runtime type of any element in this + * collection is not assignable to the {@linkplain Class#getComponentType + * runtime component type} of the generated array + * @throws NullPointerException if the generator function is null + * @since 10 + */ + default <T> T[] toArray(IntFunction<T[]> generator) { + return toArray(generator.apply(0)); + } + // Modification Operations /** * Ensures that this collection contains the specified element (optional * operation). Returns {@code true} if this collection changed as a
< prev index next >