1.Lambda表达式

1.1 Lambda表达式的标准格式

1 (形式参数) -> {代码块}

  形式参数:如果有多个参数,参数之间用逗号隔开;如果没有参数,留空即可

  ->:由英文中画线和大于符号组成,固定写法。代表指向动作

  代码块:是我们具体要做的事情,也就是以前我们写的方法体内容

组成Lambda表达式的三要素:

  形式参数,箭头,代码块

1.2 Lambda表达式的省略模式

省略的规则

  参数类型可以省略。但是有多个参数的情况下,不能只省略一个

  如果参数有且仅有一个,那么小括号可以省略

  如果代码块的语句只有一条,可以省略大括号和分号,和return关键字

1.3 Lambda表达式的注意事项

使用Lambda必须要有接口,并且要求接口中有且仅有一个抽象方法

必须有上下文环境,才能推导出Lambda对应的接口

  根据局部变量的赋值得知Lambda对应的接口

  Runnable r = () -> System.out.println("Lambda表达式");

  根据调用方法的参数得知Lambda对应的接口

  new Thread(() -> System.out.println("Lambda表达式")).start();

1.4 Lambda表达式和匿名内部类的区别

所需类型不同

  匿名内部类:可以是接口,也可以是抽象类,还可以是具体类

  Lambda表达式:只能是接口

使用限制不同

  如果接口中有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类

  如果接口中多于一个抽象方法,只能使用匿名内部类,而不能使用Lambda表达式

实现原理不同

  匿名内部类:编译之后,产生一个单独的.class字节码文件

  Lambda表达式:编译之后,没有一个单独的.class字节码文件。对应的字节码会在运行的时候动态生成

2.接口组成更新

2.1 接口组成更新概述

常量

  public static final

抽象方法

  public abstract

默认方法(Java 8)

静态方法(Java 8)

私有方法(Java 9)

2.2 接口中默认方法

格式

1 public default 返回值类型 方法名(参数列表) { }

注意事项

  默认方法不是抽象方法,所以不强制被重写。但是可以被重写,重写的时候去掉default关键字

  public可以省略,default不能省略

2.3 接口中静态方法

格式

1 public static 返回值类型 方法名(参数列表) { }

注意事项

  静态方法只能通过接口名调用,不能通过实现类名或者对象名调用

  public可以省略,static不能省略

2.4 接口中私有方法

私有方法产生原因

Java 9中新增了带方法体的私有方法,这其实在Java 8中就埋下了伏笔:Java 8允许在接口中定义带方法体的默认方法和静态方法。这样可能就会引发一个问题:当两个默认方法或者静态方法中包含一段相同的代码实现时,程序必然考虑将这段实现代码抽取成一个共性方法,而这个共性方法是不需要让别人使用的,因此用私有给隐藏起来,这就是Java 9增加私有方法的必然性.

格式1

1 private 返回值类型 方法名(参数列表) { }

格式2

1 private static 返回值类型 方法名(参数列表) { }

注意事项

  默认方法可以调用私有的静态方法和非静态方法

  静态方法只能调用私有的静态方法

3.方法引用

3.1 方法引用符

方法引用符

  :: 符号为引用运算符,而它所在的表达式被称为方法引用

推导与省略

  如果使用Lambda,那么根据“可推导就是可省略”的原则,无需指定参数类型,也无需指定的重载形式, 它们都将被自动推导

  如果使用方法引用,也是同样可以根据上下文进行推导

  方法引用是Lambda的孪生兄弟

3.2 引用类方法

引用类方法,其实就是引用类的静态方法

格式

1 类名::静态方法

接口

1 public interface Convert {
2 int convert(String s);
3 }

测试类

1 public class ConvertDemo {
2 public static void main(String[] args) {
3 useConvert(Integer::parseInt);
4 }
5
6 private static void useConvert(Convert c) {
7 System.out.println(c.convert("100"));
8 }
9 }

3.3 引用对象的实例方法

引用对象的实例方法,其实就引用类中的成员方法

格式

1 对象::成员方法

接口

1 public interface Printer {
2 void print(String s);
3 }

测试类

 1 public class Uppdemo {
2 public void toUpper(String s){
3 System.out.println(s.toUpperCase());
4 }
5 }
6
7 class Upper{
8 public static void main(String[] args) {
9 Uppdemo ud = new Uppdemo();
10
11 usePrint(ud::toUpper);
12
13 }
14
15 private static void usePrint(Printer p) {
16 p.print("hello world");
17 }
18 }

使用说明

  Lambda表达式被对象的实例方法替代的时候,它的形式参数全部传递给该方法作为参数

3.4 引用类的实例方法

引用类的实例方法,其实就是引用类中的成员方法

格式

1 类名::成员方法

测试类

 1 public interface MyStr {
2 String mySub(String s,int x,int y);
3 }
4
5 class MyStrDemo{
6 public static void main(String[] args) {
7 useMyStr(String::substring);
8 }
9
10 private static void useMyStr(MyStr ms) {
11 System.out.println(ms.mySub("hello world",2,5));
12 }
13 }

使用说明

  Lambda表达式被类的实例方法替代的时候 第一个参数作为调用者 后面的参数全部传递给该方法作为参数

3.5 引用构造器

引用构造器,其实就是引用构造方法

格式

1 类名::new

使用说明

  Lambda表达式被构造器替代的时候,它的形式参数全部传递给构造器作为参数

最新文章

  1. (十七)WebGIS中距离及面积测量的原理和实现以及坐标转换的简单介绍
  2. ado.net excel 模版
  3. OAuth 2.0 授权原理
  4. oracle中schema指的是什么?
  5. 宣布发布长期保留 Azure Backup功能
  6. How to get FlowLayoutPanel.AutoSize to work with FlowBreak
  7. linux上 安装并 运行opencv
  8. RTP 包格式 详细解析
  9. JavaEE(16) - JPA生命周期及监听器
  10. canvas绘制旋转图形
  11. 数据分区------《Designing Data-Intensive Applications》读书笔记9
  12. POJ 1979 DFS
  13. javascript 常用方法 解析URL,补充前导字符
  14. spring aop 获取request、response对象
  15. k8s (kubernetes) 代码分析
  16. angularjs探秘<二>表达式、指令、数据绑定
  17. 电脑组装DIY
  18. mysql 查询所有子节点的相关数据
  19. Fiddler抓取https设置详解
  20. apm server

热门文章

  1. beef+metasploit
  2. 面试半年,凭借这份JVM面试题,我终于拿到了字节跳动的offer!
  3. Flink-1-状态化流处理概述
  4. C++之父接受采访:对 C++ 成功的关键和发展历程进行了回顾
  5. C语言中connst用法
  6. 20190712_mysql执行sql脚本语句_Failed to open file_error
  7. 第8.5节 Python类中的__new__方法和构造方法__init__关系深入剖析:执行顺序及参数关系案例详解
  8. 第二十七章、containers容器类部件QTabWidget选项窗部件详解
  9. 分别使用python和java练习冒泡排序
  10. 简单且实用的关闭当前应用的auto.js 代码