美文网首页
2018-05-11Lambda表达式

2018-05-11Lambda表达式

作者: 加碘盐_ed6c | 来源:发表于2018-05-11 00:49 被阅读0次

Lambda表达式入门

Lambda表达式支持将代码块作为方法参数,Lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口(这种接口被称为函数式接口)的实例,这种语法避免了匿名内部类的烦琐。

// 1. 不需要参数,返回值为 5
() -> 5

// 2. 接收一个参数(数字类型),返回其2倍的值
x -> 2 * x

// 3. 接受2个参数(数字),并返回他们的差值
(x, y) -> x – y

// 4. 接收2个int型整数,返回他们的和
(int x, int y) -> x + y

// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
(String s) -> System.out.print(s)

Lambda表达式就相当于一个匿名方法,它由3部分组成。

  • 形参列表。形参列表允许省略形参类型。如果形参列表中只有一个参数,甚至连形参列表的圆括号也可以省略。
  • 箭头(->)。必须通过英文中画线和大于符号组成。
  • 代码块。如果代码块中只包含一条语句,Lambda表达式允许省略代码块的花括号。Lambda代码块只有一条return语句,甚至可以省略return关键字。若Lambda表达式需要返回值(取决于目标类型是否需要返回值),而他的代码块中仅有一条省略了return的语句,Lambda表达式会自动返回这条语句的值。

Lambda表达式与函数式接口

Lambda表达式的类型,也被称为“目标类型”,Lambda表达式的目标类型必须是“函数式接口”。函数式接口代表只包含一个抽象方法的接口。函数式接口可以包含多个默认方法、类方法,但只能声明一个抽象方法。

如果采用匿名内部类语法来创建函数式接口的实例,则只需要实现一个抽象方法,在这种情况下即可采用Lambda表达式来创建对象,该表达式创建出来的对象的目标类型就是这个函数式接口。查询java8的API文档,可以发现大量的函数式接口,例如:Runnable、ActionListener等接口都是函数式接口。

由于Lambda表达式的结果就是被当成对象,因此程序中完全可以使用Lambda表达式进行赋值,例如如下代码。

//Runnable接口中只包含一个无参数的方法
//Lambda表达式代表的匿名方法实现了Runnable接口中唯一的、无参数的方法
//因此下面的Lambda表达式创建了一个Runnable对象
Runnable r=()->{
  for(int i=0;i<100;i++)
    {
      System.out.println();
    }
 };

由于Lambda表达式实现的是匿名方法——因此它只能实现特定函数式接口中的唯一方法,这意味着Lambda表达式有如下两个限制:

  • Lambda表达式的目标类型必须是明确的函数式接口。
  • Lambda表达式只能为函数式接口创建对象。Lambda表达式只能实现一个方法,因此它只能为只有一个抽象方法的接口(函数式接口)创建对象。
    关于上面第一点限制,看下面代码是否正确:
Object obj=()->{
  for(int i=0;i<100;i++)
    {
      System.out.println();
    }
 };

上面代码与前一段代码几乎完全相同,只是此时程序将Lambda表达式不再赋值给Runnable变量,而是直接赋值给Object变量。编译上面代码,会报如下错误:

不兼容的类型:Object不是函数接口

从该错误信息可以看出,Lambda表达式的目标类型必须是明确的函数式接口。为了保证Lambda表达式的目标类型是一个明确的函数式接口,可以有如下三种常见方式。

  • 将Lambda表达式赋值给函数接口类型的变量。
  • 将Lambda表达式作为函数式接口类型的参数传递给某个方法。
  • 使用函数式接口对Lambda表达式进行强制类型转换。

注意

同样的Lambda表达式的目标类型完全可能是变化的,唯一的要求是,Lambda表达式实现的匿名方法与目标类型(函数式接口)中唯一的抽象方法有相同的形参列表。

方法引用与构造器引用

如果Lambda表达式的代码块只有一条代码,还可以在代码块中使用方法引用和构造器引用。方法引用和构造器引用都需要使用两个英文冒号。Lambda表达式支持如下表所示的几种引用方式

相关文章

  • 2018-05-11Lambda表达式

    Lambda表达式入门 Lambda表达式支持将代码块作为方法参数,Lambda表达式允许使用更简洁的代码来创建只...

  • Twig表达式

    Twig 表达式分为字面表达式、数学表达式、逻辑表达式、比较表达式、包含表达式、测试表达式、字符串插值表达式及其它...

  • php第五天--基本函数

    for变形格式for (表达式1; 表达式2; 表达式3) {循环体} 表达式1;for (; 表达式2; 表达式...

  • Python推导式(列表推导式、元组推导式、字典推导式和集合推导

    列表表达式 元祖表达式 字典表达式 集合表达式

  • 表达式

    原始表达式 最简单的表达式是“原始表达式”。原始表达式是表达式的最小单位,它们不再包含其他表达式。js中原始表达式...

  • 三元运算符

    基本格式 :(关系表达式) ? 表达式1 : 表达式2;执行流程 :关系表达式为 [真] 返回表达式1关系表达式为...

  • for循环

    for(表达式1;表达式2;表达式3){ //循环操作(输出) } 表达式1:循环变量的声明表达式.(a=...

  • daily -- mysql 基础 分支语句( if and

    if函数 语法:IF(表达式1,表达式2,表达式3); 如果表达式1成立(true),返回表达式2的值;如果表达式...

  • 表达式树

    表达式树中缀表达式转换为后缀表达式后缀表达式总结

  • linux 中 if 语句条件的含义

    文件表达式 整数变量表达式 字符串变量表达式 if [ 表达式1 –o 表达式2 ]

网友评论

      本文标题:2018-05-11Lambda表达式

      本文链接:https://www.haomeiwen.com/subject/yfdxdftx.html