JEP 302: Lambda Leftovers

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Wed Dec 7 11:18:30 UTC 2016



On 07/12/16 10:30, Nicolai Parlog wrote:
>   Hi!
>
> Great proposal! Especially the underscore is cool, much better than
> naming those variables "ignored". I wonder whether I should start using
> two underscores now so I can later replace them with a single one. :) I
> guess it will be possible to use "_" for multiple parameters?
Yes
>
> I would like to request a feature regarding method references. I like
> making non-public methods static to convey the fact that they do not
> interact with or even change the state of the object they are called on.
> But this conflicts with the ease of method references:
>
> 	// `isGenderNeutralName` is an instance method
> 	names.filter(this::isGenderNeutralName)
>
> vs
>
> 	// `isGenderNeutralName` is a static method
> 	names.filter(GenderNeutralNameProcessor::isGenderNeutralName)
>
> As a consequence I often go back and make it an instance method to keep
> the reference readable but it hurts because I give up on an immutability
> signal.
>
> It would be awesome if it were possible to reference a static method in
> the same class without repeating the entire class name. Reusing the
> `class` keyword seems like an obvious* choice:
>
> 	// `isGenderNeutralName` is a static method
> 	names.filter(class::isGenderNeutralName)
>
> Using Martijn's shorthand, IANALE (I Am Not A Language Expert) so I have
> no idea whether this is tractable but it would surely be a nice addition.
I see where you are going - a long class name leads to horizontal noise. 
However, I point out that a similar suggestion could apply to your 
instance method reference - this::isGenderNeutralName - so, why should I 
have to say 'this' if there's only one?

So I think what people would really like would be to eliminate the noise 
completely and just say something like this:

	names.filter(::isGenderNeutralName)


But note that this is a harder problem, as now you have a method 
reference expression that can match both static and instance stuff 
(which is already the case for unbound method reference, but in that 
case you can use arity to disambiguate, whereas here you cannot).

This also goes hand in hand with being able to disambiguate method 
reference easily by adding some formal/actual parameter information; if 
your qualifier expression is shorter, you can in principle have more 
ambiguities - so it could help having some syntactic support to be able 
to distinguish between method references with different signature. This 
topic was also discussed during JDK 8 development but it's not an easy 
problem to solve; ideally, you'd like to be able to denote formal 
parameter types in a method reference, as follows:

	names.filter(::isGenderNeutralName(Object))

But if the method is generic, there could be type-variables in the 
signature, and it's not clear how we denote those in the method 
reference expression.

Another alternative would be to use 'actual argument types' - so 
something like:

	names.filter(::isGenderNeutralName(String))


Where we give the compiler an hint that the first formal should be 
compatible with a 'String' type. But this looks against the spirit of 
method references, whose syntax is deliberately decl-site oriented. So, 
as you can see, optimizing for space in this area could make certain 
problem worse and it's not clear what can be done to offset such 
problems. Of course your original proposal of using 'class' to denote 
'this type' doesn't introduce additional problem, but feels like a side 
move to me.

Maurizio
>
>   so long ... Nicolai
>
>
> * I am aware that the obvious idea might be also be a terrible idea.
>
>
>
> On 07.12.2016 00:50, mark.reinhold at oracle.com wrote:
>> New JEP Candidate: http://openjdk.java.net/jeps/302
>>
>> - Mark
>>



More information about the platform-jep-discuss mailing list