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

    FutureTask<String> coverTask = new FutureTask<String>(new Callable()
{
public String call()
{
return PortalBookCoverCacheService.getInstance().getBookCover(bookItem,
PropertiesConfig.getProperty("cdnUrl"));
}
});

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

Callable callable = new Callable()
{
public String call()
{
return PortalBookCoverCacheService.getInstance().getBookCover(bookItem,
PropertiesConfig.getProperty("cdnUrl"));
}
};

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

    Callable callable = () ->
{
return PortalBookCoverCacheService.getInstance().getBookCover(bookItem,
PropertiesConfig.getProperty("cdnUrl"));
}
;

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

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

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

/** <a href="http://www.cpupk.com/decompiler">Eclipse Class Decompiler</a> plugin, Copyright (c) 2017 Chen Chao. */
/*
* ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*/
/*
*
*
*
*
*
* Written by Doug Lea with assistance from members of JCP JSR-166
* Expert Group and released to the public domain, as explained at
* http://creativecommons.org/publicdomain/zero/1.0/
*/ package java.util.concurrent; /**
* A task that returns a result and may throw an exception.
* Implementors define a single method with no arguments called
* {@code call}.
*
* <p>The {@code Callable} interface is similar to {@link
* java.lang.Runnable}, in that both are designed for classes whose
* instances are potentially executed by another thread. A
* {@code Runnable}, however, does not return a result and cannot
* throw a checked exception.
*
* <p>The {@link Executors} class contains utility methods to
* convert from other common forms to {@code Callable} classes.
*
* @see Executor
* @since 1.5
* @author Doug Lea
* @param <V> the result type of method {@code call}
*/
@FunctionalInterface
public interface Callable<V> {
/**
* Computes a result, or throws an exception if unable to do so.
*
* @return computed result
* @throws Exception if unable to compute a result
*/
V call() throws Exception;
}

  所以可以我们通过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. MySQL索引优化详解

    MySQL存储引擎简介 查看命令 a. 查看所使用的MySQL现在已提供什么存储引擎: mysql> show engines; b. 查看所使用的MySQL当前默认的存储引擎: mysql&g ...

  2. Android_布局属性大全

    RelativeLayout 第一类:属性值为true可false android:layout_centerHrizontal        水平居中 android:layout_centerVe ...

  3. Prism 4 文档 ---第7章 组成用户界面

    一个应用程序的用户界面(UI)可以通用以下几种模式之一来构建: 窗体所需要所有的控件都包含在一个单独的XAML文件中,在设计时组合这个窗体. 窗体的逻辑区域被分割到单独的部分中,通常指哟过户控件.这些 ...

  4. LINUX中文件描述符传递

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  5. New Concept English there (25)

    38w/m 65 One of the most famous sailing ships of the nineteenth century, the Cutty Sark, can still b ...

  6. LINUX系统下的squid服务

    一.squid服务实现正向代理 正向代理,是一个位于客户端和原始服务器之间的服务器. 客户端可以通过服务器的缓存数据,得到所需的结果. 示例:在一台可以联网的主机上,安装squid软件之后,就可以在另 ...

  7. 初识jQuery(1)

    1.Jquery是对JavaScript对象和函数的封装(JavaScript框架) 2.怎么使用Jquery 第一步:把js文件放入项目中 第二步:在页面引用jquery <script ty ...

  8. Linux内核源代码目录结构详解

    http://blog.csdn.net/u013014440/article/details/44024207

  9. 用css和php脚本来使得poscms的list标签顺利输出记录

    每次拿到前端给的页面,都会有意想不到的惊喜,因为他们给的页面总是不能很好地契合poscms的模板标签 输出规范,这时候就需要动点脑筋去解决问题了. 拿前两天拿到的一类(对,你没看错,是一类)页面来说吧 ...

  10. 【跟着stackoverflow学Pandas】Delete column from pandas DataFrame-删除列

    最近做一个系列博客,跟着stackoverflow学Pandas. 以 pandas作为关键词,在stackoverflow中进行搜索,随后安照 votes 数目进行排序: https://stack ...