lambda表达式其实就是指一个匿名函数,应用最广泛的就是匿名内部类的简化。在jdk1.8之前,我们定义一个匿名内部类可能需要写一大坨代码,现在有了lambda之后,可以写的很简洁了。但不是说lambda只能用来简化匿名内部类,从lambda的实际作用和表现上来看,它就是一个变量指代了一个代码块。而能够使用lambda表达式的一个前提要求是,该变量必须实现某个函数式接口。啥是函数式接口?参考jdk1.8新特性之函数式接口。看一个匿名内部类的例子:

  1. FutureTask<String> coverTask = new FutureTask<String>(new Callable()
  2. {
  3. public String call()
  4. {
  5. return PortalBookCoverCacheService.getInstance().getBookCover(bookItem,
  6. PropertiesConfig.getProperty("cdnUrl"));
  7. }
  8. });

  上面在实例化FutureTask对象的时候,使用了Callable接口实例的匿名内部类,实际上FutureTask构造器里就是一个Callable的实例:

  1. Callable callable = new Callable()
  2. {
  3. public String call()
  4. {
  5. return PortalBookCoverCacheService.getInstance().getBookCover(bookItem,
  6. PropertiesConfig.getProperty("cdnUrl"));
  7. }
  8. };

  如果我们使用lambda表达式,上面的callable变量实际上就是

  1. Callable callable = () ->
  2. {
  3. return PortalBookCoverCacheService.getInstance().getBookCover(bookItem,
  4. PropertiesConfig.getProperty("cdnUrl"));
  5. }
  6. ;

  callable变量指代的就是一段代码块,把这个变量放入FutureTask的构造器里,匿名内部类可以简化为:

  1. FutureTask<String> coverTask = new FutureTask<String>(() -> {
  2. return PortalBookCoverCacheService.getInstance()
  3. .getBookCover(bookItem, PropertiesConfig.getProperty("cdnUrl"));
  4. });

  为啥能这么简化呢?因为它符合lambda表达式规范,即Callable是一个函数式接口:

  1. /** <a href="http://www.cpupk.com/decompiler">Eclipse Class Decompiler</a> plugin, Copyright (c) 2017 Chen Chao. */
  2. /*
  3. * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
  4. *
  5. *
  6. *
  7. *
  8. *
  9. *
  10. *
  11. *
  12. *
  13. *
  14. *
  15. *
  16. *
  17. *
  18. *
  19. *
  20. *
  21. *
  22. *
  23. *
  24. */
  25. /*
  26. *
  27. *
  28. *
  29. *
  30. *
  31. * Written by Doug Lea with assistance from members of JCP JSR-166
  32. * Expert Group and released to the public domain, as explained at
  33. * http://creativecommons.org/publicdomain/zero/1.0/
  34. */
  35.  
  36. package java.util.concurrent;
  37.  
  38. /**
  39. * A task that returns a result and may throw an exception.
  40. * Implementors define a single method with no arguments called
  41. * {@code call}.
  42. *
  43. * <p>The {@code Callable} interface is similar to {@link
  44. * java.lang.Runnable}, in that both are designed for classes whose
  45. * instances are potentially executed by another thread. A
  46. * {@code Runnable}, however, does not return a result and cannot
  47. * throw a checked exception.
  48. *
  49. * <p>The {@link Executors} class contains utility methods to
  50. * convert from other common forms to {@code Callable} classes.
  51. *
  52. * @see Executor
  53. * @since 1.5
  54. * @author Doug Lea
  55. * @param <V> the result type of method {@code call}
  56. */
  57. @FunctionalInterface
  58. public interface Callable<V> {
  59. /**
  60. * Computes a result, or throws an exception if unable to do so.
  61. *
  62. * @return computed result
  63. * @throws Exception if unable to compute a result
  64. */
  65. V call() throws Exception;
  66. }

  所以可以我们通过lambda表达式省略了接口类型、方法名和方法参数(因为这里call方法根本就不需要参数),->符号的左边是参数列表(如果有参数的话),右边是方法体。lambda其实是通过编译器的强大而赋予的能力,编译器通过自动匹配接口类型、智能识别参数列表,可以像考古学家根据蛛丝马迹恢复物品的原貌的一样,还原出匿名内部类的本来面目。

  

  

jdk1.8新特性之lambda表达式的更多相关文章

  1. JDK1.8新特性(一) ----Lambda表达式、Stream API、函数式接口、方法引用

    jdk1.8新特性知识点: Lambda表达式 Stream API 函数式接口 方法引用和构造器调用 接口中的默认方法和静态方法 新时间日期API default   Lambda表达式     L ...

  2. jdk1.8新特性之lambda表达式及在Android Studio中的使用举例

    Jdk1.8已经出很久了但是很多同学对它的特性在android studio 中的应用可能还不是很熟悉,今天我们就来对这个新特性在AS中做它的应用实践. 一.首先在有JDK1.8的情况下我们要在AS的 ...

  3. java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合

    java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合 比如,我有一张表: entity Category.java service CategoryServic ...

  4. Java8 新特性学习 Lambda表达式 和 Stream 用法案例

    Java8 新特性学习 Lambda表达式 和 Stream 用法案例 学习参考文章: https://www.cnblogs.com/coprince/p/8692972.html 1.使用lamb ...

  5. Java8新特性之Lambda表达式

    lambda表达式是java8给我们带来的几个重量级新特性之一,借用lambda表达式,可以让我们的java程序设计更加简洁.最近新的项目摒弃了1.6的版本,全面基于java8进行开发,本文是java ...

  6. C++11新特性之一——Lambda表达式

    C++11新特性总结可以参考:http://www.cnblogs.com/pzhfei/archive/2013/03/02/CPP_new_feature.html#section_6.8 C++ ...

  7. Java8 新特性之Lambda表达式

    1. Lambda 表达式概述 Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递); Lambda 表达式可以写出更简洁,更灵活的代码 ...

  8. java8新特性之——lambda表达式的使用

    lambda表达式简介 个人理解,lambda表达式就是一种新的语法,没有什么新奇的,简化了开发者的编码,其实底层还是一些常规的代码.Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解 ...

  9. 夯实Java基础(二十二)——Java8新特性之Lambda表达式

    1.前言 Java 8于14年发布到现在已经有5年时间了,经过时间的磨练,毫无疑问,Java 8是继Java 5(发布于2004年)之后的又一个非常最重要的版本.因为Java 8里面出现了非常多新的特 ...

随机推荐

  1. SPOJ 694 && SPOJ 705 (不重复子串个数:后缀数组)

    题意 给定一个字符串,求它的所有不重复子串的个数 思路 一个字符串的子串都必然是它的某个后缀的前缀.对于每一个sa[i]后缀,它的起始位置sa[i],那么它最多能得到该后缀长度个子串(n-sa[i]个 ...

  2. SQL 添加字段

    制定添加在那个字段后面 ALTER TABLE `szq`.`org_sales_daily` ADD COLUMN `trade_id_onl_count` int(11) NOT NULL DEF ...

  3. MySQL使用RPM包方式安装

        CentOS7安装MySQL的方法之RPM包方式        

  4. div居中和table居中,jQuery获取下拉列表值

    一.div居中 margin-left: auto;margin-right: auto; <div  style="width:960px ; margin-left: auto;m ...

  5. js停止(阻止)浏览器继续加载内容

    这个应该是一个比较特殊的要求,一般网站都没有这个功能,对于一个新手来说,真的不知道从何处下手,只有在网上搜索了,寻找现成答案,寻寻觅觅一天没有结果.但是这个功能还是需要,第二天继续网上大肆搜寻.终于功 ...

  6. 转载:【Oracle 集群】RAC知识图文详细教程(五)--特殊问题和实战经验

    文章导航 集群概念介绍(一) ORACLE集群概念和原理(二) RAC 工作原理和相关组件(三) 缓存融合技术(四) RAC 特殊问题和实战经验(五) ORACLE 11 G版本2 RAC在LINUX ...

  7. qml 关于鼠标穿透的问题

    最近在开发过程中,遇到了鼠标穿透的问题.结合网上给予的方法,都试了一圈,在这里总结一下: import QtQuick 2.9import QtQuick.Window 2.2import QtQui ...

  8. Java基础学习-Collection体系结构和迭代测试

    package Collection; import java.util.ArrayList; import java.util.Collection; import java.util.Iterat ...

  9. 随手写的一个检测php连接mysql的小脚本

    最近偶然接触到一点点的php开发,要用到mysql数据库,由于mysql和php版本的关系,php5里面连接函数有mysql_connect(),mysqli_connect()两种,php7中又使用 ...

  10. 动态加载vs静态加载

    动态加载: 1:灵活,可以在需要的时候用LoadLibrary进行加载,在不需要的时候用FreeLibrary进行卸载,这样可以不必占用内存. 2:可以在没有dll时候发现,而不致程序报错. 3:加载 ...