Effectively final
blackbelt1999
blackbelt1999 at sbcglobal.net
Wed Sep 14 11:46:27 PDT 2011
Is there not a fundamental difference between the original code and the new
code, namely the original code creates a new thread of execution while the new
code does not? If so, can't the new code be simplified to:
void foo(final Socket socket) {
boolean timedOut = false;
system.setTimeout(100, () => { timedOut = true; });
socket.onData(() => { if (!timedOut) System.out.println("Got data"); });
}
The above version .does not go through the expense of creating a new object
while providing the same behavior?
--Alan
________________________________
From: Steven Simpson <ss at comp.lancs.ac.uk>
To: lambda-dev at openjdk.java.net
Sent: Wed, September 14, 2011 4:10:42 AM
Subject: Re: Effectively final
Just a loose end...
On 15/08/11 15:41, Tim Fox wrote:
> On 15/08/2011 15:22, Steven Simpson wrote:
>> void foo(final Socket socket) {
>> new Runnable() {
>> boolean timedOut;
>> public void run() {
>> system.setTimeout(100, #{ timedOut = true; });
>> socket.onData(#{ if (!timedOut) System.out.println("Got data");
>});
>> }
>> }.run();
>> }
> Steven, firstly thanks for putting in the effort to look at this. And
> kudos for your ingenuity :)
And yet I missed this trick!:
void foo(final Socket socket) {
new Object() {
boolean timedOut;
void run() {
system.setTimeout(100, () -> { timedOut = true; });
socket.onData(() -> { if (!timedOut) System.out.println("Got data");
});
}
}.run();
}
So the object doesn't have to be Runnable, and run() doesn't have to be
public, return void, or be called run! That's more convenient if you
want to return a value, rather than doing tricks with Callable:
return new Object() {
int run() { return 0; }
}.run();
Cheers,
Steven
More information about the lambda-dev
mailing list