support lambda expressions in lambda return statements

Ali Ebrahimi ali.ebrahimi1781 at gmail.com
Wed Jun 8 06:09:52 PDT 2011


Hi all,
code in another syntax is as:

       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 ->
             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 ->
                 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,SAM1<Void,String>>,File> eachLine2 = 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) {}
                };


       eachLine2.apply(file).apply(line -> System.out.println(line) );


SAM1<SAM1<SAM1<Void,SAM1<Void,String>>,File>,ExceptionHandler<IOException>>
eachLine3 = exceptionHandler ->
              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 (IOException e) {
                          exceptionHandler.handle(e);
                    }
                };


       eachLine3.apply(e -> {/* handle e  */}).apply(file).apply(line -> {
            System.out.println(line);
            });


Best Regards,
Ali Ebrahimi
On Wed, Jun 8, 2011 at 3:53 PM, Ali Ebrahimi <ali.ebrahimi1781 at gmail.com>wrote:

> Hi Maurizio,
> yes, this is my bad.
> The corrected version is:
>
> SAM1<SAM1<Void,SAM1<Void,String>>,File> eachLine2=...
>
> Also I corrected this line:
> SAM1<SAM1<SAM1<Void,SAM1<Void,String>>,File>,ExceptionHandler<IOException>>
> eachLine3=...
>
> Best Regards,
> Ali Ebrahimi
>
> On Wed, Jun 8, 2011 at 2:52 PM, Maurizio Cimadamore <
> maurizio.cimadamore at oracle.com> wrote:
>
>> 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