Streams factories in Stream

Peter Levart peter.levart at gmail.com
Tue Apr 23 22:59:12 PDT 2013

+1

And if the translation used invokedynamic to obtain a cached empty array
of a particular element type (like lambda metafactory does for lambdas),
the overhead to obtain such would be minimal.

Regards, Peter

On 04/24/2013 03:00 AM, John Rose wrote:
> On Apr 23, 2013, at 12:14 PM, Brian Goetz <brian.goetz at oracle.com> wrote:
>
>> You've already paid the cost of boxing the args into an empty array.
> Yuck, that bugs me.  We can fix the zero-length cost by doing for zero-length arrays what we do for boxing conversion.
>
> That is:
>
> 5.1.7 Boxing Conversion
>
> ... At run time, boxing conversion proceeds as follows:
> ... If p is a value of type int, then boxing conversion converts p into a reference r of class and type Integer, such that r.intValue() == p...
> [NOTE: There is no "new" operator in the specification, just a guarantee that the implementation finds a suitable box for the value.]
> ... Ideally, boxing a given primitive value p, would always yield an identical reference. In practice, this may not be feasible using existing implementation techniques. The rules above are a pragmatic compromise...
>
> The varargs boxing logic is here:
>
> 15.12.4.2 Evaluate Arguments
> ... If the method being invoked is a variable arity method m, it necessarily has n > 0 formal parameters. The final formal parameter of m necessarily has type T[] for some T, and m is necessarily being invoked with k ≥ 0 actual argument expressions.
>
> [INSERT] If m is being invoked with k = n-1 actual argument expressions, then the argument list (e1, ..., en-1) is evaluated as if it were written as (e1, ..., en-1, a0), where a0 is an array whose type is the erasure (§4.6) of T[] and whose length is zero.
>
> If m is being invoked with k ≠ n actual argument expressions, or, if m is being invoked with k = n actual argument expressions and the type of the k'th argument expression is not assignment compatible with T[], then the argument list (e1, ..., en-1, en, ..., ek) is evaluated as if it were written as (e1, ..., en-1, new |T[]| { en, ..., ek }), where |T[]| denotes the erasure (§4.6) of T[].
>
> The preceding paragraphs are crafted to handle the interaction of parameterized types and array types ...
>
> [INSERT] They are also crafted to allow implementations to optimize the case of an empty argument array, by neither mandating nor forbidding the creation of a new array at runtime.
>
> Either javac or the JVM or both could use this permission to remove the allocation cost for zero-length varargs.
>
> — John
>