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