Example 4
The Example 4
class is another lambda but this time it takes an instance of Server
as an argument. It's equivalent in functionality to example 2 but it doesn't close over the variable; it's not a closure.
public class Example4 { // lambda with arguments void example() throws InterruptedException { waitFor(new HttpServer(), (server) -> server.isRunning()); } }
Just like example 2, the bytecode has to create the instance of server but this time, the invokedynamic
opcode references the test
method of type Predicate
. If we were to follow the reference (#4
) to the boostrap methods table, we would see the actual lambda requires an argument of type HttpServer
and returns a Z
which is a primitive boolean.
void example() throws java.lang.InterruptedException; descriptor: ()V flags: Code: stack=2, locals=1, args_size=1 0: new #2 // class Server$HttpServer 3: dup 4: invokespecial #3 // Method Server$HttpServer...