1. 方法引用
方法引用 其实 本质上 就是Lambda 表达式 ,之前已经知道 Lambda 是作为一个函数式接口的实例 ,因此,方法引用也就是一个函数式接口的实例
使用的情况:
-
当要将值传给Lambda 体,已经有实现的方法,不用自己在lambda 体里边写多行逻辑代码
-
接口中抽象方法的形参列表 和 返回值类 与 方法引用 的形参列表和返回值类型 相同
但是这两种使用的情况 只 适用 对象 : : 非静态方法 和 类 : : 静态方法
要是对lambda 体 是什么,跟函数式接口不明白,可以先看看这篇篇文章,循序渐进 java8 (jdk 1.8) 新特性——Lambda及函数式接口
使用格式,很简单,总体概括 类(对象) : : 方法名
细分:
对象 : : 非静态方法 (适用)
类 : : 静态方法 (适用)
类 : : 非静态方法 ,当发现,多个参数中,有一个参数是作为方法的调用方就可以使用 【这是 这种情况的特殊体现,后面举例】
- 对象 : : 非静态方法
举个例子:
@Test
public void tes10() {
Consumer<String> consumer = str -> System.out.println(str);
consumer.accept("坚持就是胜利");
}
这是没有简写成方法引用的写法,先来分析一下,简单的输出语句
System.out.println(str)
点开源码
println 是 PrintStream 的一个非静态方法 ,也就是说 System.out 代指 PrintStream 这个对象
PrintStream ps = System.out;
ps.println("坚持就是胜利");
之前说,要传值给lambda体,已经有实现的方法,就可以使用方法引用,这边有自己的输出方法
并且, 抽象方法的形参列表跟返回值类型 与 输出的 是一样的
因此,根据格式:
对象是 System.out 方法名:println 简写为
Consumer<String> consumer = System.out::println;
consumer.accept("坚持就是胜利");
慢慢理解吧,用着用着就熟了
再来看:
UserInfo userInfo = new UserInfo(1, "张三", 18);
Supplier<String> su = () ->userInfo.getName();
Supplier<String> su = userInfo::getName;
同样的对象有自己的方法
Supplier是一个 供给型的函数式接口,也是java8 后才有的
这边
getName() 无参 ,返回类型 string
get() 无参 ,返回类型 string [泛型 T 但是我申明的是接收String ]
- 类 : : 静态方法
比较两个数大小
Comparator<Integer> con = (x,y) ->Integer.compare(x,y);
con.compare(6,8);
分析 :
Comparator 中的 compare 有两个参数, 返回类型为 int
Integer 类 中的compare 方法 也是两个参数 ,返回值类型也是int
静态方法,因此:
Comparator<Integer> con = Integer::compare;
con.compare(6,8);
- 类 : : 非静态方法
还是比较两个数大小,这次使用compareTo ,一个非静态方法
Comparator<Integer> con = (t1,t2)->t1.compareTo(t2);
con.compare(6,8);
可以看到这边参数t1是作为一个调用者,虽然他们参数不同
但可以使用 方法引用
Comparator<Integer> con = Integer::compareTo;
con.compare(6,8);
2 . 构造器引用
构造器引用其实跟方法引用没什么差,八九不离十,只不过是换成了使用构造器
package com.test1.demo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
/**
* @author Administrator
*/
@ToString
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserInfo {
private Integer id;
private String name;
private Integer age;
}
无参构造才可以
Supplier<UserInfo> supplier = () -> new UserInfo();
Supplier<UserInfo> supplier = UserInfo::new;
因为 Supplier 的get 抽象 方法也是无参的