1.lambda表达式
1.1什么是lambda表达式
Lambda Lambda 是一个 匿名函数 ,我们可以把 Lambda Lambda Lambda 表达式理解为是 一段可以 传递的代码 (将代码像数据一样进行传递)。使用它可以写出更 简洁、灵活的代码。作为一种更紧凑风格,使 Java 的语言表达能力得到了提升
1.2lambda表达式的使用
lamda表达式结构:
-
左边—>lamda形参列表
-
右边---->lambda体
lambda表达式的本质:作为函数式接口的实例
1.3语法格式(六种格式)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KncX4APl-1623669652510)(https://raw.githubusercontent.com/yzy54/picBed/master/img/image-20210614170645912.png)]
总结:
- 左边:lambda形参列表的类型可以省略(类型推断)。如果lamdba形参列表只有一个参数则可以省略
- 右边:lambda体用{}包裹。如果只有一条执行语句(可以是return),那么此时可以省略{}和return
1.4函数式接口
只包含一个抽象方法的接口,称为 函数式接口
@FunctionalInterface 注解,这样做可以检测是否是一个函数式接口
1.5方法引用
-
当要传递给Lambda体的操作,已经有实现方法了可以使用方法引用
-
方法引用可以看做是 Lambda表达式深层次的。换句话说,方法 引用就 是Lambda表达式 ,也就是 函数式接口的一个实例,通过方法名字来指向 一个方法,可以认为是 Lambda 表达式的语法糖
格式:使用操作符 “:: ” 将类 (或对象 ) 与 方法名分隔开
使用场景:
-
对象 :: 实例方法名
-
类:: 静态方法名
-
类:: 实例方法名
-
当函数式接口方法的 (第一个参数 是需要引用 方法的调者,并且第二 个参数是需要引用方法的参数(或无参数 )时):
ClassName::methodName
实例
//情况一(非静态方法,使用对象调用)
public void test1(){
PrintStream ps = System.out;
Consumer<String> con = ps::println;
con.accept("beijing");
System.out.println("---------");
Consumer<String> con2 = (str)-> System.out.println(str);
con2.accept("beijing");
}
//情况二静态方法
public void test2(){
Comparator<Integer> com1 = (t1, t2)->Integer.compare(t1, t2);
System.out.println(com1.compare(12, 21));
//方法引用
System.out.println("-----------");
Comparator<Integer> com2 = Integer::compare;
System.out.println(com2.compare(12, 21));
}
public void test3(){
// 情况三:类调用非静态方法
//第一个参数作为第二个参数的调用者出现
// int compare(s1, s2)
// int t1.compareTo(t2)
Comparator<String> com1 = (s1, s2) -> s1.compareTo(s2);
System.out.println(com1.compare("abc", "abd"));
System.out.println("----------");
Comparator<String> com2 = String::compareTo;
}
使用要求
要求接口中的抽象方法的形参列表和返回值类型与方法引用的方法的形参列表和返回值相同
1.6构造器引用
语法:
ClassName::new
可以把构造器引用赋值给定义的方法,要求 构造器参数列表要与接口中抽象
如果有多个构造器,会自动选择与其参数匹配的构造器
package jdk8;
public class Emp {
String name;
int id;
public Emp() {
System.out.println("construct0");
}
public Emp(int id) {
this.id = id;
System.out.println("construct1");
}
public Emp(String name, int id) {
this.name = name;
this.id = id;
System.out.println("construct2");
}
@Override
public String toString() {
return "Emp{" +
"name='" + name + '\'' +
", id=" + id +
'}';
}
}
@Test public void test4(){
Function<Integer, Emp> func1 = Emp::new;
Emp apply = func1.apply(1002);
System.out.println(apply);
BiFunction<String, Integer, Emp> func2 = Emp::new;
Emp tom = func2.apply("tom", 1002);
System.out.println(tom);
}
结果
construct1
Emp{name='null', id=1002}
construct2
Emp{name='tom', id=1002}
1.7数组引用
语法
type[]::new
System.out.println(tom);
}
结果
construct1
Emp{name=‘null’, id=1002}
construct2
Emp{name=‘tom’, id=1002}
### 1.7数组引用
语法
```java
type[]::new
数组引用可以看成一个类,写法与构造器完全相同