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...