recursive lambda as a local variable

Zhong Yu zhong.j.yu at gmail.com
Wed Sep 11 10:32:16 PDT 2013


State of the Lambda seems to suggest that this can be done for local variables:

http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-4.html

> When a lambda expression appears in any other context, such as a return expression, there is no way for it to refer to itself. The proper approach in such cases is to name the object with a variable declaration and replace the original expression with a variable reference.




On Wed, Sep 11, 2013 at 12:16 PM, Brian Goetz <brian.goetz at oracle.com> wrote:
> Its not so much "intentional" as a consequence of language rules that
> predate lambda.
>
> In the first example, r is a field; in the second, it is a local.  What the
> first lambda really is shorthand for is:
>
>     Runnable r = () -> this.r.run();
>
> So this lambda captures 'this', whereas the second lambda captures 'r'.  The
> latter runs into definite-assignment issues, but fields are not subject to
> assignment and flow analysis.
>
> Of course, when you use 'this' from the initializer of a field, you are on
> thin ice.
>
>
> On 9/11/2013 12:37 PM, Zhong Yu wrote:
>>
>> This compiles: (b106)
>>
>>      class Test
>>      {
>>          Runnable r = ()->r.run();
>>      }
>>
>> but this doesn't:
>>
>>      void test()
>>      {
>>          Runnable r = ()->r.run();
>>      }
>>
>> is that intentional or a bug?
>>
>> Zhong Yu
>>
>


More information about the lambda-dev mailing list