方法引用(::)是JDK1.8的新特性:
可以使用方法引用来优化Lambda表达式,(我觉得Lambda已经是很简化的格式了,但是这个玩意把Lambda都简化了,太牛掰,初期理解可能有难度,但是习惯了是真的爽)如下格式:
new Object() 可以简写为 Object::new(就是把new放后头了,参数自动传递了)
Object.method(a,b) 可以简写为 Object::method(就是替换了“.”,参数自动传递了)
注意:方法引用的前后两端都是已经存在的。不能让不存在的对象和方法名执行方法引用。方法引用会把参数传递给::后面的方法名。
eg1系统方法引用:
//想要使用Lambda表达式需要使用函数式接口
@FunctionalInterface
public interface PrintMethod {
void getPrint(String name);
}
public static void get(PrintMethod p){
p.getPrint("lalal");
}
public static void main(String[] args) {
//Lambda表达式写法
get( name -> System.out.println(name));
//方法引用
//System.out对象是存在的,println方法也是存在的
//直接把参数传递给println方法后的小括号,并简写
get( System.out::println);
}
eg2对象的方法引用:
//想要使用Lambda表达式需要使用函数式接口
@FunctionalInterface
public interface PrintMethod {
void getPrint(String name);
}
//含有方法的类
public class MyUpperCaseMethod {
public void method(String str){
System.out.println(str.toUpperCase());
}
}
public static void method2(PrintMethod p){
p.getPrint("Hello");
}
public static void main(String[] args) {
//Lambda
method2(s->{
MyUpperCaseMethod me = new MyUpperCaseMethod();
me.method(s);
});
//方法引用前对象必须存在,对象的方法必须存在
MyUpperCaseMethod me2 = new MyUpperCaseMethod();
method2(me2::method);
//更简单一点点
method2(new MyUpperCaseMethod()::method);
}
eg3静态方法+两个参数的方法引用:
//函数式接口
@FunctionalInterface
public interface Calculate {
int methed(int a,int b);
}
//含有静态方法的类
public class Sum {
public static int method(int a,int b){
return a+b;
}
}
//main
public static int sum(int a,int b,Calculate c){
return c.methed(a,b);
}
public static void main(String[] args) {
//Lambda
int sum = sum(10, 15, (a, b) -> Sum.method(a, b));
System.out.println(sum);
//方法引用优化,“::”换“.”,两个参数也直接默认传进去。
int s = sum(20, 15, Sum::method);
System.out.println(s);
}
egX其他的也都差不多:
super.method()等效于
super::method
this.method()等效于
this::method
构造方法例如new Person(name,age)等效于:
Person::new
创建数组等效于:
int[]::new
emmmmm…学无止境,肯定有什么更好的应用方式,努力探索吧!!(本人小白,有错请指正哦。)