support lambda expressions in lambda return statements

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Wed Jun 8 04:22:43 PDT 2011


Hi Ali,
in your example I noticed various instance of the following pattern:

static interface SAM1<R,A> {
    R apply(A n);
}

void test() {
    SAM1<SAM1<Void,String>,File> eachLine2 = #{file ->
       return #{ lineHandler -> lineHandler.apply(""); };
    };
}

This seems to be wrong, right? I.e. method apply should not be available 
on 'lineHandler', given that 'lineHandler' would be inferred to be 
String from the corresponding SAM type (SAM1<Void, String>).

Maurizio

On 08/06/11 10:28, Ali Ebrahimi wrote:
> static interface SAM1<R,A> {
>         R apply(A n);
>    }
>
>    static interface SAM0<R> {
>         R apply();
>    }
>
>    static interface SAM2<R,A,B> {
>         R apply(A a,B b);
>    }
>
>    interface ExceptionHandler<E extends Throwable>{
>                 void handle(E e);
>    }
>
> ....
>
>        SAM1<SAM1<Integer,Integer>,Integer> sum = #{x -> #{y -> x + y }};
>
>        int z = sum.apply(0).apply(5);
>
>        SAM1<SAM1<Void,SAM0<Void>>, Integer> afterDelay = #{ x ->
>             return #{ f ->
>                         try {
>                              Thread.sleep(x*1000);
>                              f.apply();
>                             } catch (Exception e) {}
>                      };
>        };
>
>        afterDelay.apply(5).apply( #{System.out.println("foo")});
>
>        SAM1<Void,SAM0<Void>> after10Seconds  = afterDelay.apply(10);
>
>        after10Seconds.apply(#{System.out.println("bar")});
>
>
>         SAM1<SAM1<Void,SAM1<Void,PrintWriter>>,File> withWriter = 
> #{file ->
>                return #{ doWithWriter ->
>                     try {
>                         try(PrintWriter writer = new PrintWriter(file)){
>                             doWithWriter.apply(writer);
>                             }
>                         } catch (Exception e) {}
>            };
>         };
>
>         File file = new File("log.txt");
>
>         withWriter.apply(file).apply(#{writer ->
>             // Printing to the file
>             writer.println("foo");
>             for (int i=0;i<10;i++) writer.println(i);
>         });
>
>         SAM1<Void,SAM1<Void,PrintWriter>> logger = withWriter.apply(file);
>
>         logger.apply(#{writer ->
>             writer.println("foo");
>         });
>
>         logger.apply(#{writer ->
>             for (int i=0;i<10;i++) writer.println(i);
>         });
>
>
>         SAM2<Void,File,SAM1<Void,String>> eachLine = #{file,lineHandler ->
>             try {
>                     try(BufferedReader reader = new BufferedReader(new 
> InputStreamReader(new FileInputStream(file)))){
>                         String line = null;
>                         while((line = reader.readLine()) != null) {
>                             lineHandler.apply(line);
>                         }
>                     }
>                 } catch (Exception e) {}
>         };
>
>
>        eachLine.apply(file, #{line ->
>             System.out.println(line);
>             }
>        );
>
>         SAM1<SAM1<Void,String>,File> eachLine2 = #{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 (Exception e) {}
>                 };
>         };
>
>
>        eachLine2.apply(file).apply(#{line ->
>             System.out.println(line);
>             }
>        );
>
>        
> SAM1<SAM1<SAM1<Void,String>,File>,ExceptionHandler<IOException>> 
> eachLine3 = #{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);
>                     }
>                 };
>         };
>         };
>
>
>
>        eachLine3.apply(#{IOException e -> /* handle e  
> */}).apply(file).apply(#{line ->
>             System.out.println(line);
>             }
>        );



More information about the lambda-dev mailing list