以一个例子说明
public interface FunInterface {
    void prints(String s);
}
public class Demo {
    public static void main(String[] args) {
     print((s)-> System.out.println(s));
    }
    public static void print(FunInterface M){
        M.prints("hello,world");
    }
}分析:
lambda表达式目的:打印参数传递的字符串,把参数传给System.out对象,调用Out对象的方法println对字符串输出。
使用方法引用优化Lambda表达式:
public class Demo {
    public static void main(String[] args) {
     print(System.out::println);//::参数省略
    }
    public static void print(FunInterface M){
        M.prints("hello,world");
    }
}方法引用符:
 ::为引用运算符,所在的表达式被称为“方法引用”
如果lambda要表达的函数方案已经存在于某个方法的实现中,那么则可以通过双冒号来引用该方法作为Lambda的替代者
print((s)-> System.out.println(s));
print(System.out::println);//::参数省略
通过对象名引用成员方法:
例:
接口
@FunctionalInterface
public interface FunInterface {
    void prints(String s);
}类中定义方法:
public class Myclass {
    public void printUpperCase(String str){
        System.out.println(str.toUpperCase(Locale.ROOT));
    }
}测试类未使用方法引用:
public class Demo {
    public static void main(String[] args) {
      //通过对象名引用成员方
        Myclass mc=new Myclass();
        printString((s)->mc.printUpperCase(s));
    }
    public static void printString(FunInterface m){
        m.prints("hello");
    }    
}使用方法引用:
public class Demo {
    public static void main(String[] args) {
      //通过对象名引用成员方
        Myclass mc=new Myclass();
        printString(mc::printUpperCase);
    }
    public static void printString(FunInterface m){
        m.prints("hello");
    }    
}通过类名引用静态成员方法:
类已经存在,静态成员方法也已经存在
例:计算一个数的绝对值
接口:
@FunctionalInterface
public interface FunInterface {
   int calAbs(int a);
}测试类(未使用方法引用):
public class Demo {
    public static void main(String[] args) {
      method(10,(n)->Math.abs(n));
    }
    public static int method(int num,FunInterface m){
        return m.calAbs(num);
    }
}测试类(使用方法引用):
public class Demo {
    public static void main(String[] args) {
        System.out.println(method(10,Math::abs));
    }
    public static int method(int num,FunInterface m){
        return m.calAbs(num);
    }
}math类是存在的,abs静态方法也是存在的,直接使用类名::静态方法化简lambda表达式
通过Super引用父类的成员方法:
接口:
public interface Greetable {
    void greet();
}父类:
//定义父类
public class Human {
    public void sayHello(){
        System.out.println("hello,human");
    }
}子类:
//子类
public class Man extends Human{
    //子类重写父类sayHello的方法
    @Override
    public void sayHello() {
        System.out.println("hello,man");
    }
    public void method(Greetable g){
        g.greet();
    }
    public void show(){
        method(super::sayHello);
    }
    public static void main(String[] args) {
        new Man().show();
    }
}通过this引用成员方法:
接口:
public interface Greetable {
    void greet();
}定义父类:
//定义父类
public class Human {
    public void sayHello(){
        System.out.println("hello,human");
    }
}子类:
public class Man extends Human{
    //子类重写父类sayHello的方法
    @Override
    public void sayHello() {
        System.out.println("hello,man");
    }
    public void method(Greetable g){
        g.greet();
    }
    public void show(){
        method(this::sayHello);
    }
    public static void main(String[] args) {
        new Man().show();
    }
}类的构造器引用:
person类:
public class Person {
    private String name;
    public Person(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
}构造person的抽象类:
public interface gouzao {
    Person personBuilder(String name);
}测试类:
public class Demo {
    public static void main(String[] args) {
        PersonBuild("zhangsan",Person::new);
    }
    public static void PersonBuild(String name,gouzao g){
        System.out.println(g.personBuilder(name).getName());
    }
}数组的构造器引用:
public interface gouzao {
  int[] buliderArray(int length);
}public class Demo {
    public static void main(String[] args) {
        ArrayBuild(10,int[]::new);
    }
    public static void ArrayBuild(int length,gouzao g){
        System.out.println(g.buliderArray(length).length);
    }
}









