f(x) syntax sugar in Lambda
    Maurizio Cimadamore 
    maurizio.cimadamore at oracle.com
       
    Thu Feb  9 01:46:09 PST 2012
    
    
  
Hi,
I think there might be few problems with this approach when unleashed in 
a more widespread way:
*) Java has two separate namespaces for methods/fields - so the 
following would be ambiguous:
Exponent exp = (x) -> 1 + x + x * x / 2;
void exp(int x) { ... }
exp(3) //?
*) The language does not have such a thing as 'type of a lambda' so, 
there is no way to distinguish between:
SAM s = ()-> { ... }
and
SAM s = new SAM() { ... }
This means that your proposal will apply to all expressions whose type E 
is a functional interface.
*) What if E is a method call? You end up with things like:
Exponent makeExp() { ... }
makeExp()(5);
*) If you have a functional interface with default methods:
interface Exponent {
    double calculate(double x);
    void foo() default { ... }
    void bar() default { ... }
}
then the fact that the syntactic sugar will rewire the method call to 
'calculate' (as that's the only abstract method in Exponent) might 
result a bit surprising since there is more than one method available in 
the functional interface.
Maurizio
On 09/02/12 07:41, Spot Al wrote:
> Hi,
>
> For example if there is an interface
> -----------------------------------------------
>   interface Exponent{
>       double calculate(double x);
>   }
> -----------------------------------------------
>
> and I have a lambda expression:
> -----------------------------------------------
> Exponent exp = (x) ->  1 + x + x * x / 2;
> -----------------------------------------------
>
> would it be possible to get a value like:
>    double e = ep(1);
> instead of
>    double e = exp.calculate(1); ?
>
> Where exp(1) just a syntax sugar for the exp.calculate(1).
>
> So if variable a has a lambda type (interface with one method) than a(val1,.., valN) means a.methodName(val1,.., valN)?
>
> Thanks,
> Alexander.
>
>
>
>
>
    
    
More information about the lambda-dev
mailing list