Collection.toArray(IntFunction)
Peter Levart
peter.levart at gmail.com
Thu May 30 00:30:05 PDT 2013
Hi,
Are you still accepting suggestions for lambdafication of core libraries?
What about the following default method in j.u.Collection:
/**
* Returns an array containing all of the elements in this collection;
* an array is constructed by invoking the given {@code arrayFactory}
* with the {@code int} argument of this {@code Collection)'s
{@link #size}.
* If the collection fits in the constructed array, it is returned
therein.
* Otherwise, a new array is allocated with the same runtime type
and the
* size of this collection.
*
* <p>If this collection fits in the array constructed by {@code
arrayFactory}
* with room to spare (i.e., the array has more elements than this
collection),
* the element in the array immediately following the end of the
collection is
* set to <tt>null</tt>. (This is useful in determining the length
of this
* collection <i>only</i> if the caller knows that this collection does
* not contain any <tt>null</tt> elements.)
*
* <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
* be used to save allocation costs.
*
* <p>Suppose <tt>x</tt> is a collection known to contain only strings.
* The following code can be used to dump the collection into a newly
* allocated array of <tt>String</tt>:
*
* <pre>
* String[] y = x.toArray(String[]::new);</pre>
*
* Note that <tt>x.toArray(String[]::new)</tt> is identical in
function to
* <tt>x.toArray(new String[x.size()])</tt>, except that in
situations where
* the reference to {@code Collection} is not already available as
a local variable
* (such as when it is returned from a call to a method) there's no
need to
* introduce such local variable.
*
* @param arrayFactory the array factory function that will be
invoked to
* construct the array of appropriate size into which the
elements of
* this collection are to be stored.
* @return an array containing all of the elements in this collection
* @throws ArrayStoreException if the component type of the array
constructed
* by {@code arrayFactory} is not a supertype of the
runtime type of
* every element in this collection
* @throws NullPointerException if the specified arrayFactory is
null or if
* arrayFactory returns null array.
* @since 1.8
*/
default <T> T[] toArray(IntFunction<T[]> arrayFactory) {
return toArray(arrayFactory.apply(size()));
}
I also noticed an error in the javadoc of the other
Collection.toArray(T[]) method (line 240). Instead of the following:
* @throws ArrayStoreException if the *runtime*type of the
specified array
* is not a supertype of the runtime type of every element in
* this collection
I think it should be:
* @throws ArrayStoreException if the *component*type of the
specified array
* is not a supertype of the runtime type of every element in
* this collection
Regards, Peter
More information about the lambda-dev
mailing list