Translating lambda expressions as Synthetic static methods: Recursively Capturing

Ali Ebrahimi ali.ebrahimi1781 at gmail.com
Sat Jun 25 03:43:50 PDT 2011


Hi all,
Scenario 2: Recursively Capturing final or effectively final states from
multi-level lambdas

In this case outer lambdas may captures states that themself don't use them
directly, but accessed by inner lambdas.
public class InnerLambdaTest {

   public static void main(String[] args) {

SAM1<SAM1<SAM1<Void,SAM1<Void,String>>,File>,ExceptionHandler<IOException>>
eachLine = #{exceptionHandler ->
             return #{file ->
               return #{ lineHandler ->
                    try {
                        try (BufferedReader reader = new BufferedReader(new
InputStreamReader(new FileInputStream(file)))){
                            String line = null;
                            while((line = reader.readLine()) != null) {
                                lineHandler.apply(line);
                            }
                        }
                    } catch (IOException e) {
                          exceptionHandler.handle(e);
                    }

                   };
                };
        };

       File file = new File("log.txt");
       eachLine3.apply(#{ e ->  }).apply(file).apply(#{line ->
            System.out.println(line);
            }
       );
}
}


Translated as:

public class InnerLambdaTest {
   public static void main(String[] args) {

SAM1<SAM1<SAM1<Void,SAM1<Void,String>>,File>,ExceptionHandler<IOException>>
eachLine31 = LambdaHelper.asSam(lambda$1mh, SAM1.class);

    eachLine31.apply(LambdaHelper.asSam(lambda$main$1mh,
ExceptionHandler.class))
               .apply(file).apply(LambdaHelper.asSam(lambda$main$2mh,
SAM1.class));
   }

    static final MethodHandle lambda$1mh =
LambdaHelper.createStaticMH(InnerLambdaTest.class, "lambda$1",
MethodType.methodType(SAM1.class, ExceptionHandler.class)) ;
    static final  MethodHandle
lambda$2mh=LambdaHelper.createStaticMH(InnerLambdaTest.class, "lambda$2",
MethodType.methodType(SAM1.class, ExceptionHandler.class,File.class));
    static final  MethodHandle
lambda$3mh=LambdaHelper.createStaticMH(InnerLambdaTest.class, "lambda$3",
MethodType.methodType(void.class,
ExceptionHandler.class,File.class,SAM1.class));

    static final MethodHandle lambda$main$1mh =
LambdaHelper.createStaticMH(InnerLambdaTest.class, "lambda$main$1",
MethodType.methodType(void.class, IOException.class)) ;
    static final MethodHandle
lambda$main$2mh=LambdaHelper.createStaticMH(InnerLambdaTest.class,
"lambda$main$2", MethodType.methodType(void.class, String.class)); ;

    public static void lambda$main$1(IOException e){
    }

    public static void lambda$main$2(String line){
           System.out.println(line);
    }

    public static SAM1<SAM1<Void,SAM1<Void,String>>,File>
lambda$1(ExceptionHandler<IOException> exceptionHandler){
        return LambdaHelper.asSam(lambda$2mh, SAM1.class, exceptionHandler,
null);
    }

    public static SAM1<Void,SAM1<Void,String>>
lambda$2(ExceptionHandler<IOException> exceptionHandler, File file){
        return LambdaHelper.asSam(lambda$3mh, SAM1.class, exceptionHandler,
file, null);
    }

    public static void lambda$3(ExceptionHandler<IOException>
exceptionHandler, File file, SAM1<Void, String> lineHandler) {
        try {
            try(BufferedReader reader = new BufferedReader(new
InputStreamReader(new FileInputStream(file)))){
                String line = null;
                while ((line = reader.readLine()) != null) {
                    lineHandler.apply(line);
                }
            }
        } catch (IOException e) {
            exceptionHandler.handle(e);
        }
    }

}


Best Regards,
Ali Ebrahimi


More information about the lambda-dev mailing list