Example 5
Lastly, example 5 uses a lambda but closes over the server instance. It's equivalent to example 2 and is a new style closure.
public class Example5 { // closure void example() throws InterruptedException { Server server = new HttpServer(); waitFor(() -> !server.isRunning()); } }
It goes through the basics in the same way as the other lambdas but if we lookup the metafactory
method in the bootstrap methods table, you'll notice that this time, the lambda's method handle has an argument of type Server
. It's invoked using invokestatic
(line 9) and the variable is passed directly into the lambda at invocation time.
BootstrapMethods: 0: #34 invokestatic LambdaMetafactory.metafactory: (LMethodHandles$Lookup; LString;LMethodType; LMethodType; LMethodHandle;LMethodType;)LCallSite; Method arguments: #35 ()LBoolean; // <-- SAM method to be implemented by the ...