-
为什么:
java8引入函数式接口之后,如果要在满足函数式接口编程的要求,需要对原来的方法进行改造,定义函数式接口,为了解决这个改造的问题,引入了"::"双冒号操作符。在Java8中,我们可以直接通过方法引用来简写lambda表达式中已经存在的方法,这种特性叫做方法引用(Method Reference)。
-
是什么
方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法。方法引用提供了一种引用而不执行方法的方式,它需要由兼容的函数式接口构成的目标类型上下文。计算时,方法引用会创建函数式接口的一个实例。
-
怎么用
有以下四种形式的方法引用:
引用对象的实例方法 | Object::instanceMethodName |
引用类的静态方法 | ClassName::staticMethodName |
引用类的实例方法 | ClassName::methodName |
引用构造方法 | ClassName::new |
1.引用对象的实例方法
private static void instanceMethod(List<String> list) {
list.forEach(new DoubleColon()::printNormal);
}
private void printNormal(String content) {
System.out.println("引用对象的实例方法测试结果:" + content);
}
2.引用类的静态方法
private static void staticMethod(List<String> list) {
list.forEach(DoubleColon::print);
}
private static void print(String num) {
System.out.println("引用类的静态方法测试结果:" + num);
}
3.引用类的实例方法
private static void classInstanceMethod() {
Banner banner1 = new Banner(1, "b1", null, 2);
Banner banner2 = new Banner(2, "b2", null, 1);
List<Banner> bannerList = new ArrayList<Banner>() {
{
add(banner1);
add(banner2);
}
};
bannerList.sort(Banner::compareLocation);
System.out.println("引用类的实例方法测试结果:" + bannerList);
}
public class Banner {
//主键
private Integer id;
// 名称
private String name;
//链接地址
private String linkUrl;
//展示位置
private Integer localtion;
public Banner() {
}
public Banner(Integer id) {
this.id = id;
}
public Banner(Integer id, String name, String linkUrl, Integer localtion) {
this.id = id;
this.name = name;
this.linkUrl = linkUrl;
this.localtion = localtion;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLinkUrl() {
return linkUrl;
}
public void setLinkUrl(String linkUrl) {
this.linkUrl = linkUrl;
}
public int compareLocation(Banner banner) {
return this.localtion - banner.localtion;
}
@Override
public String toString() {
return "Banner{" +
"id=" + id +
", name='" + name + '\'' +
", linkUrl='" + linkUrl + '\'' +
", localtion=" + localtion +
'}';
}
}
4. 引用构造方法
private static void cons() {
Function<Integer, Banner> nann = Banner::new;
System.out.println("引用构造方法测试结果:" + nann.apply(1));
}
执行测试
public static void main(String[] args) {
/**第一层大括弧,定义一个匿名内部类
*第二个大括弧是初始化块(由于匿名内部类没有类名,所以无法定义构造函数,但是可以通过初始化块来完成初始化的工作)
*/
List<String> list = new ArrayList<String>() {
{
add("111");
}
};
instanceMethod(list);
staticMethod(list);
classInstanceMethod();
cons();
}
测试结果: