SSブログ

ラムダ式(2) [Java 8]

ラムダ式に実際に渡されているオブジェクトが何であるかを調べるためのテストコードです。
import java.util.Arrays;
import java.util.function.Consumer;

public class Lambda02 {
    public static void main(String[] args) {
        showInfoOfLambda(msg -> System.out.println(msg));
    }

    private static void showInfoOfLambda(Consumer<String> consumer) {
        consumer.accept("Hello World");

        Class<?> consumerClass = consumer.getClass();
        System.out.printf("class name : %s%n", consumerClass.getName());
        showImplementedInterfaces(consumerClass);
        showSuperclass(consumerClass);
    }

    private static void showImplementedInterfaces(Class<?> consumerClass) {
        Class<?>[] interfaces = consumerClass.getInterfaces();

        if (interfaces.length == 0) {
            System.out.println("no interface is implemented");
            return;
        }

        System.out.print("implements : ");
        Arrays.asList(interfaces).forEach(
            cl -> System.out.printf("%s ", cl));
        System.out.println();
    }

    private static void showSuperclass(Class<?> consumerClass) {
        System.out.printf("superclass : %s%n",
                         consumerClass.getSuperclass());
    }
}
ラムダ式を受け付けるメソッドとしてshowInfoOfLambdaメソッドを定義して、mainメソッドで引数を表示するだけのラムダ式を渡しています。

showInfoOfLambdaでは、最初に、Consumerインタフェースとして渡された引数に対して、acceptメソッドを呼び出しています。次に渡されたオブジェクトのクラス、実装しているインタフェース、スーパークラスと順に表示しています。

このプログラムをコンパイルして実行すると、次の結果になります。
shibata-yoshiki-no-macbook:java8study yoshiki$ javac Lambda02.java
shibata-yoshiki-no-macbook:java8study yoshiki$ java Lambda02
Hello World
class name : Lambda02$$Lambda$1
implements : interface java.util.function.Consumer 
superclass : class java.lang.invoke.MagicLambdaImpl
shibata-yoshiki-no-macbook:java8study yoshiki$ ls -l *.class
-rw-r--r--  1 yoshiki  staff  2313  3 17 11:07 Lambda02.class
shibata-yoshiki-no-macbook:java8study yoshiki$ 
実際に渡されているオブジェクトのクラスは、Lambda02$$Lambda$1、実装しているインタフェースはjava.util.function.Consumer、スーパークラスは java.lang.invoke.MagicLambdaImplと表示されています。

また、コンパイル結果の.classファイルは、Lambda02.classしかありません。したがって、Lambda02$$Lambda$1は、実行時に動的に生成されていることが推測されます。