When lambdas become objects

Remi Forax forax at univ-mlv.fr
Wed Nov 28 03:36:31 PST 2012


On 11/28/2012 06:05 AM, Brian Goetz wrote:
>>> Implementations are permitted to do so, and ours (mostly) does.  But this is not guaranteed and you should not assume that it does.
>> When you say I shouldn't assume that it does, you mean that I
>> shouldn't rely on that behavior for my program's correctness, right?
> Correct.

Technically the implementation may create two lambda objects if two 
threads reach at the same time the code that creates the lambda object 
once but the implementation will always return only one of the two. 
Because creating a lambda object has no side effect it's not a problem.
That's a reason why we don't support lambda that implements abstract 
class, because in that case, the constructor of the abstract class
should have been called twice.

>
>>>> Does every invocation of isFunActivity() return a separate Predicate
>>>> instance?  Or, would a given FunDetector instance always return the same
>>>> Predicate instance?
>>> Because isFun is an instance method, you have to capture the receiver variable 'this', so each capture is likely to result in a new object. (Note you could have written this both more compactly and more explicitly as "return this::isFun".)
>> Are there plans to eventually do some sort of instance-level caching &
>> reuse of these lambdas, when the lambdas only capture 'this', either
>> later in the JDK8 development cycle or else in a future version of
>> Java?
> It's definitely out of scope for 8.  While its possible we might
> consider things like this in the future, realistically there are much
> higher-leverage optimizations where we'd likely put our efforts first.
> (Such as, reducing the cost of lambda capture in the first place.)
>

yes, caching objects is so 2000 :)
There are better optimizations based on the idea that the VM should not 
create the lambda object if not necessary,
so a call to the lambda method through the lambda object will be 
replaced by a direct call to the lambda method without creating the 
lambda object, reducing the cost of the lambda capture to zero.

Rémi




More information about the lambda-dev mailing list