java lambda表达式 闭包学习笔记

我们把这些只拥有一个方法的接口称为函数式接口。
声明一个接口是函数式接口:编译器会根据接口的结构自行判断(判断过程并非简单的对接口方法计数:一个接口可能冗余的定义了一个Object已经提供的方法,比如toString(),或者定义了静态方法或默认方法,这些都不属于函数式接口方法的范畴)。不过API作者们可以通过@FunctionalInterface注解来显式指定一个接口是函数式接口(以避免无意声明了一个符合函数式标准的接口),加上这个注解之后,编译器就会验证该接口是否满足函数式接口的要求。另外如果函数式结构内定义有一个抽象函数外还有Object类中定义的public函数 ,其仍旧算是SAM(Single Abstract Method)类型,比如其还有一个函数叫做equals 那么仍旧是SAM,因为这个函数是Object类的公有函数。




java中,Lambda表达式是SAM(Single Abstract Method)类型,SAM类型是一个具有单一抽象方法的接口。(Java8接口可以包含非抽象方法了-即default/defender方法)  参考java Consumer接口.


lambda表达式,又称闭包、匿名方法,其语法由参数列表、箭头符号->和函数体组成。其有一作用是在某些场景下代替内部类。
例如:(int x, int y) -> x + y 表示一个函数接受两个int类型作为参数并且返回他们的和。
基本语法:
(parameters) -> expression

(parameters) -> { statements; }




λ表达式可以被当做是一个Object:
一个函数式接口如下:
    @FunctionalInterface
    public interface Runnable { void run(); }
    你可以用一个λ表达式为一个函数接口赋值:
 
    Runnable r1 = () -> {System.out.println("Hello Lambda!");};
    
然后再赋值给一个Object:


    Object obj = r1;
    
但却不能这样干:


    Object obj = () -> {System.out.println("Hello Lambda!");}; // ERROR! Object is not a functional interface!


必须显式的转型成一个函数接口才可以:


    Object o = (Runnable) () -> { System.out.println("hi"); }; // correct
    
    
一个λ表达式只有在转型成一个函数接口后才能被当做Object使用。所以下面这句也不能编译:


    System.out.println( () -> {} ); //错误! 目标类型不明
 
 
lambda表达式代替内部类的演示:
下面的例子:


    Thread oldSchool = new Thread( new Runnable () {
        @Override
        public void run() {
            System.out.println("This is from an anonymous class.");
        }
    } );
    
    Thread gaoDuanDaQiShangDangCi = new Thread( () -> {
        System.out.println("This is from an anonymous method (lambda exp).");
    } );
    
    
    
   for(Object o: list) { // 外部迭代
        System.out.println(o);
    }


可以写成:


    list.forEach(o -> {System.out.println(o);}); //forEach函数实现内部迭代
    
    
    
    
    
    
    
    
    
    

    个人理解:  lambda表达式可以在需要一个函数式接口的地方发挥作用,在此时不再传入函数式接口,而是传入lambda表达式。



更多用法参考  http://blog.csdn.net/ioriogami/article/details/12782141  这篇博文讲的非常详细。

    
    摘抄自:
    http://blog.csdn.net/ioriogami/article/details/12782141
    http://blog.csdn.net/renfufei/article/details/24600507
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值