Java1.8新特性方法引用

Java1.8新特性方法引用

简述

方法引用(::)是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…学无止境,肯定有什么更好的应用方式,努力探索吧!!(本人小白,有错请指正哦。)

你可能感兴趣的:(Java-basic)