+1 from me.
> On Jun 14, 2018, at 9:02 PM, Stuart Marks <stuart.ma...@oracle.com> wrote:
>
> Hi all,
>
> I wanted to restart review of the changeset for bug JDK-8060192 [1]. The
> latest webrev is here: [2].
>
> The previous review was from December 2017: [3]. The only difference between
> the current changeset and the previous one is the removal of the overriding
> implementations (see explanation below). Much of the discussion in the
> previous review thread was around performance and the shape of the API.
>
> # Performance
>
> I previously had done some benchmarking on this and reported the results:
> [4]. (I've recently re-done the benchmarks and conclusions are essentially
> the same.)
>
> The upshot is that implementations that use Arrays.copyOf() are the fastest,
> probably because it's an intrinsic. It can avoid zero-filling the freshly
> allocated array because it knows the entire array contents will be
> overwritten. This is true regardless of what the public API looks like. The
> default implementation calls generator.apply(0) to get a zero-length array
> and then simply calls toArray(T[]). This goes through the Arrays.copyOf()
> fast path, so it's essentially the same speed as toArray(new T[0]).
>
> The overrides I had previously provided in specific implementation classes
> like ArrayList actually are slower, because the allocation of the array is
> done separately from filling it. This necessitates the extra zero-filling
> step. Thus, I've removed the overrides.
>
> # API Shape
>
> There was some discussion about whether it would be preferable to have a
> Class parameter as a type token for the array component type or the array
> type itself, instead of using an IntFunction generator. Most of this boils
> down to what people are comfortable with. However, there are a few points
> that make the generator function approach preferable.
>
> One point in favor of using a generator is that Stream already has a similar
> toArray(generator) method.
>
> Comparing this to the type token alternatives, for simple tasks like
> converting Collection<String> to String[], things are about equal:
>
> toArray(String[]::new)
> toArray(String.class)
> toArray(String[].class)
>
> However, things are hairier if the element type of the collection is generic,
> such as Collection<List<String>>. The result type is a generic array
> List<String>[]. Using class literals or array constructor references will
> necessitate using an unchecked cast, because none of these can be used to
> represent a generic type.
>
> However, it's possible to use a method reference to provide a properly
> generic IntFunction. This would enable the toArray(generator) method to be
> used without any unchecked casts. (The method it refers to might need have an
> unchecked cast within it, though.) Such a method could also be reused for the
> corresponding Stream.toArray(generator) method.
>
> For these reasons I'd like to proceed with adding toArray(generator) API.
>
> Thanks,
>
> s'marks
>
>
> [1] https://bugs.openjdk.java.net/browse/JDK-8060192
>
> [2] http://cr.openjdk.java.net/~smarks/reviews/8060192/webrev.3/
>
> [3]
> http://mail.openjdk.java.net/pipermail/core-libs-dev/2017-December/050325.html
>
> [4]
> http://mail.openjdk.java.net/pipermail/core-libs-dev/2017-December/050585.html
>