Lambda表达式支持将代码块作为方法参数,Lambda表达式允许使用简洁的代码来创建只有一个抽象方法的接口(这种接口被称为函数是接口)的实例

意义

  • 自从Java 8开始,Java支持Lambda表达式
  • 当使用Lambda表达式代替匿名内部类创建对象时,Lambda表达式的代码块将会代替实现抽象方法的方法体,Lambda表达式就相当于一个匿名内部类

Lambda表达式的构成:

  • 形参列表。形参列表允许省略形参类型。如果形参列表中只有一个参数,甚至连形参列表的圆括号也可以省略
  • 箭头(->)
  • 代码块。若只包含一条语句,则可以省略花括号。若只有一条return语句,可以省略return语句,Lambda会自动返回这条语句的值
interface Eatable{
void taste();
}
interface Flyable{
void fly(String weather);
}
interface Addable{
int add(int a , int b);
}
public class LambdaQs{
// 调用该方法需要Eatable对象
public void eat(Eatable e){
System.out.println(e);
e.taste();
}
// 调用该方法需要Flyable对象
public void drive(Flyable f){
System.out.println("我正在驾驶:" + f);
f.fly("【碧空如洗的晴日】");
}
// 调用该方法需要Addable对象
public void test(Addable add){
System.out.println("5与3的和为:" + add.add(5, 3));
}
public static void main(String[] args){
LambdaQs lq = new LambdaQs();
// Lambda表达式的代码块只有一条语句,可以省略花括号
lq.eat(()-> System.out.println("苹果的味道不错!"));
// Lambda表达式的形参列表只有一个形参,省略圆括号
lq.drive(weather ->{
System.out.println("今天天气是:" + weather);
System.out.println("直升机飞行平稳");
});
// Lambda表达式的代码块只有一条语句,省略花括号
// 代码块中只有一条语句,即使该表达式需要返回值,也可以省略return关键字
lq.test((a , b)->a + b);
}
}

Lambda表达式与函数式接口

  • Lambda表达式类型,也称之为 “目标类型” ,Lambda表达式的目标类型必须是 “函数时接口(functional interface)”。函数时接口代表包含一个抽象方法的接口。函数时接口可以包含多个默认方法,类方法,但只能声明一个抽象方法
  • 函数式接口使用@FunctionalInterface注解
  • Lambda主要的限制:
    • Lambda表达式的目标类型必须是明确的函数式接口
    • Lambda表达式只能为函数式接口创建对象
  • Java8在java.util.function包下定义了大量的函数式接口,典型的为以下四种:
    • XxxFunction:这类接口中通常包含一个apply()抽象方法
    • XxxConsumer:这类接口中通常包含一个accept()抽象方法
    • XxxPredicate:这类接口中通常包含一个test()抽象方法
    • XxxSupplier:这类接口中通常包含一个getAsXxx()抽象方法

方法引用与构造器引用

种类 示例 说明 对应的Lambda表达式
引用类方法 类名::类方法 函数式接口中被实现方法的全部参数传给该类方法作为参数 (a,b,…) -> 类名.类方法(a,b,…)
引用特定对象的实例方法 特定对象::实例方法 函数式接口中被实现方法的全部参数传给该方法作为参数 (a,b,…) -> 特定对象.实例方法(a,b,…)
引用某类对象的实例方法 类名::实例方法 函数式接口中被实现方法的第一个参数作为调用者,后面的参数全部传给该方法作为参数 (a,b,…) -> a.实例方法(b,…)
引用构造器 类名::new 函数式接口中被实现方法的全部参数传给该类方法作为参数 (a,b,…) -> new 类名(a,b,…)

Lambda表达式与匿名内部类的联系和区别

  • 相同点:

    • Lambda表达式与匿名内部类一样,都可以直接访问 “effectively final” 的局部变量,以及外部类的成员变量(包括实例变量和类变量)
    • Lambda表达式创建的对象与匿名内部类生成的对象一样,都可以直接调用从接口中继承的默认方法
  • 不同点:
    • 匿名内部类可以为任意接口创建实例;但Lambda表达式只能为函数式接口创建实例
    • 匿名内部类可以为抽象类甚至普通类创建实例;但Lambda表达式只能为函数式接口创建实例
    • 匿名内部类实现的抽象方法的方法体允许调用接口定义中定义的默认方法;但Lambda表达式的代码块不允许调用接口中定义的默认方法

Java学习笔记-Lambda表达式的更多相关文章

  1. Java8学习笔记----Lambda表达式 (转)

    Java8学习笔记----Lambda表达式 天锦 2014-03-24 16:43:30 发表于:ATA之家       本文主要记录自己学习Java8的历程,方便大家一起探讨和自己的备忘.因为本人 ...

  2. .net学习笔记---lambda表达式(自执行方法)

    http://www.cnblogs.com/jesse2013/p/happylambda.html#b034 lambda表达式 http://www.cnblogs.com/OceanEyes/ ...

  3. Java学习:Lambda表达式

    Lambda表达式 函数式编程思想概述---强调做什么,而不是以什么形式做 面向对象的思想: 做一件事情,找一个能解决这个的事情的对象,调用对象的方法,完成事情 函数式编程思想 只要能获取到结果,谁去 ...

  4. java学习笔记—EL表达式(38)

    EL表达式 EL即Expression Language,主要的任务是帮助开发者简化获取域属性. 但是一般情况下需要使用EL和JSTL结合使用. 语法: ${ // 隐含对象|直接写域中的属性 }  ...

  5. 0028 Java学习笔记-面向对象-Lambda表达式

    匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...

  6. 【Java学习笔记之三十一】详解Java8 lambda表达式

    Java 8 发布日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表达式,它将允许我们将行为传到函数里.在Java 8之前 ...

  7. java 8 中lambda表达式学习

    转自 http://blog.csdn.net/renfufei/article/details/24600507 http://www.jdon.com/idea/java/10-example-o ...

  8. java学习笔记06--正则表达式

    java学习笔记06--正则表达式 正则表达式可以方便的对数据进行匹配,可以执行更加复杂的字符串验证.拆分.替换等操作. 例如:现在要去判断一个字符串是否由数字组成,则可以有以下的两种做法 不使用正则 ...

  9. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

随机推荐

  1. IntelliJ IDEA必装插件以及SpringBoot使用小技巧合集

    IntelliJ IDEA必装插件 有不知道怎么安装的吗?File-->settings打开设置面板,找到plugins,输入想要安装的插件回车即可 1.背景图片 目前,IDEA支持设置背景图片 ...

  2. .Net Core 过滤器

    请求: public class MyRequest { [Required(ErrorMessage = "Name参数不能为空")]//Required 验证这个参数不能为空 ...

  3. Entity Framework学习过程

    ///安装ef nuget中文控制台指令 PM> Install-Package EntityFramework.zh-Hans <!--配置数据库连接--> <connect ...

  4. P4047 [JSOI2010]部落划分 并查集

    思路:并查集+生成树 提交:2次(虽然样例都没过但感觉是对的$QwQ$(判边少了一条)) 题解: 把所有点之间连边,然后$sort$一遍,从小往大加边,直到连第$n-k+1$条边(相当于是破话$k$个 ...

  5. Oracle - 特殊字符问题

    Oracle更新表字段或者查询表字段时内容中含有特殊字符&的解决方法 现象 解决方式 1. 字符串拼接 UPDATE T_MENU_INFO SET menu_code='/ABeptjk/g ...

  6. loj#6285 数列分块入门 9 ( 回 滚 )

    题目 :  链接 :https://loj.ac/problem/6285 题意:给出一个长为 n的数列,以及 n个操作,操作涉及询问区间的最小众数. 思路:虽然这不是一道 回滚莫队题,就是 暴力分块 ...

  7. [Luogu] 兽径管理

    题面:https://www.luogu.org/problemnew/show/P1340 题解:https://www.zybuluo.com/wsndy-xx/note/1153773

  8. openstack 无法创建新虚拟机报错 openstack报错:Host is not mapped to any cell

    关联错误提示:Host is not mapped to any cell 控制节点上执行: root@ubsv:/home/makeit# nova-manage cell_v2 discover_ ...

  9. devstack 使用openstack命令报错 The request you have made requires authentication. (HTTP 401) Missing value auth-url required for auth plugin password

    关联错误: The request you have made requires authentication. (HTTP 401) (Request-ID: req-88ad2cba-0f2d-4 ...

  10. C++常用字符串函数使用整理

    strlen(字符数组) 功能:求字符串长度. 说明:该函数的实参可以是字符数组名,也可以是字符串. 使用样例: char s1[80] = "China"; cout<&l ...