首页
登录 | 注册

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

相关文章

  • 阿里新一代分布式任务调度平台Schedulerx2.0破土而出
    1. 产品简介 Schedulerx2.0是阿里中间件自研的基于Akka架构的新一代分布式任务调度平台,提供定时.任务编排.分布式跑批等功能.使用Schedulerx2.0,您可以在控制台配置管理您的定时任务,查询历史执行记录,查看运行日志 ...
  • 深浅拷贝的定义: 浅拷贝只是增加了一个指针指向一个存在的地址, 深拷贝是增加一个指针并且开辟了新的内存,这个增加的指针指向这个新的内存, 采用浅拷贝的情况,释放内存,会释放同一内存,深拷贝就不会出现释放同一内存的错误 一层的情况: impo ...
  • 简单的SSM-Shiro安全框架搭建
    首先需要导jar包! 配置你自己的web.xml CharacterEncodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding utf-8 f ...
  • JDBC----学习(1)----基础知识
    1   DBC是java访问数据库的基石,JDO, Hibernate等只是更好的封装了JDBC. 2  JDBC(Java Database Connectivity)是一个独立于特定数据库管理系统.通用的SQL数据库存取和操作的公共接口 ...
  • 一份还热乎的蚂蚁金服面经(已拿Offer)!附答案!!
    本文来自我的知识星球的球友投稿,他在最近的校招中拿到了蚂蚁金服的实习生Offer,整体思路和面试题目由作者--泽林提供,部分答案由Hollis整理自知识星球<Hollis和他的朋友们>中「直面Java」板块. 经历了漫长一个月的 ...
  • 云原生的新思考,为什么容器已经无处不在了
    4月24日,中国信息通信研究院主办的首届云原生产业大会在北京举行,在<云原生数字引领未来>的主题演讲中,阿里云容器服务总监易立表示:"云原生不但可以很好的支持互联网应用,也在深刻影响着新的计算架构.新的智能数据应用.以 ...

2020 jeepshoe.net webmaster#jeepshoe.net
13 q. 0.261 s.
京ICP备10005923号