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表达式的代码块不允许调用接口中定义的默认方法

最新文章

  1. luogg_java学习_12_线程
  2. Distinct删除重复数据时 自定义的方法比较【转】
  3. Qt SizePolicy 属性
  4. Android Wear开发 - 数据通讯 - 第零节 : 打包Wear应用(手机和手表应用如何连接)
  5. ContentType
  6. Google用户登录界面 Android实现
  7. Unity NGUI UIPanel下对粒子的剪裁
  8. C#集合之列表
  9. Esper剖析
  10. Xcode中编译iOS程序,运行出错:Thread 1: signal SIGABRT
  11. Python记录14:面向对象编程 类和对象
  12. Centosphp安装cassandra扩展
  13. C# Select
  14. tensorflow模型在实际上线进行预测的时候,使用CPU工作
  15. 【每日一题】 UVA - 1588 Kickdown
  16. (C/C++学习笔记) 六. 表达式
  17. eclipse无法加载主类错误(项目上红色感叹号问题解决)
  18. CLR笔记-枚举类型
  19. 17 hashlib模块
  20. JavaScript实现大整数减法

热门文章

  1. C语言实现的文件交互
  2. js实现填写身份证号、手机号、准考证号等信息自动空格的效果
  3. docker的网络服务
  4. npm install、npm install --save与npm install --save-dev (转)
  5. .net常用属性
  6. Cogs 1345. [ZJOI2013] K大数查询(树套树)
  7. iptables防火墙--------基本概念
  8. 【概率论】4-1:随机变量的期望(The Expectation of a Random Variable Part II)
  9. 更改用户id 和组id
  10. Win内核原理与实现学习笔记1-windows内核版本列表