Example 3
The Example 3Â class uses a Java lambda with our waitFor method. The lambda doesn't do anything other than return true. It's equivalent to example 1.
public class Example3 {
// simple lambda
void example() throws InterruptedException {
waitFor(() -> true);
}
}The bytecode is super simple this time. It uses the invokedynamic opcode to create the lambda at line 3 which is then passed to the invokestatic opcode on the next line.
 void example() throws java.lang.InterruptedException;
Code:
0: invokedynamic #2, 0 // InvokeDynamic #0:isSatisfied:
()LCondition;
5: invokestatic #3 // Method WaitFor.waitFor:(LCondition;)V
8: returnThe descriptor for the invokedynamic call is targeting the isSatisfied method on the Condition interface (line 3.).
What we're not seeing here is the mechanics of invokedynamic. The invokedynamic opcode is a new opcode to Java 7, it was intended to provide better support for...