JAVA--高级基础开发

  • 第二章《Stream流》
  • 方法的引用
  1. 在使用Lambda的时候,实际上传递的是一段代码,拿什么参数作什么操做,

2.1 沉于的Lambda表达式

/*app

冗余的 Lambda 场景dom

*/ide

public class Demo12 {函数

      public static void main(String[] args) {this

        //Lambda表达式spa

        printString(s-> System.out.println(s));.net

}对象

   public static void printString(MyInter1 myInter1){继承

      myInter1.print("Hello,World!");接口

    }
}

@FunctionalInterface

interface MyInter1{

   public void print(String str);

}

分析: 其中 printString 方法只管调用 MyInter1 接口的 print 方法,而并无论 print 方法的具体实现逻辑会将字符串输出到什么地方去。而 main 方法经过 Lambda 表达式指定了函数式接口MyInter1 的具体操做方案为:拿到 String(类型能够推导,因此可省略)数据后,在控制台输出它。

2.2 用方法引用改进代码

  • 可否省去 Lambda 的语法格式?只要引用过去就好了。

public class Demo12 {

      public static void main(String[] args) {

        //Lambda表达式

       // printString(s-> System.out.println(s));

        printString(System.out::println);

}

   public static void printString(MyInter1 myInter1){

      myInter1.print("Hello,World!");

    }

}

@FunctionalInterface

interface MyInter1{

   public void print(String str);

}

请注意其中的双冒号::写法,这被称为“方法引用”,而双冒号是一种新的语法

2.3 方法的引用

  1. 双冒号为引用运算符::而它所在的表达式称为方法的引用,若是Lambda表达的函数方案已经存在与某个方法的实现中,那么能够经过双冒号来引用该方法做为Lambda表达式的替代者。
  2. 例如,System.out 对象中有一个重载的 println(String)方法刚好就是咱们所须要的,那么对于printString 方法的函数式接口参数,对比如下两种写法,彻底等效:
  • Lambda 表达式写法:s->System.out.println(s);
  • 方法引用写法:System.out::println
  1. 第一种语义指的是:拿到参数后经Lambda表达式,在传递给System.out.println方法。
  2. 第二种语义指的是:  直接让System.out中的println方法来代替Lambda表达式。
  3. 两种写法的执行效果彻底同样,而第二种方法引用的写法复用了已有方案,更加简洁。
  4. 【注意:Lambda 中传递的参数必定是方法引用中的那个方法能够接收的类型,不然会抛出异常】
  • 推导与省略

若是使用 Lambda,那么根据“可推导就是省略”的原则,无需指定参数类型,也无需指定重载形式---它们都被自动推导,而若是使用方法引用,也一样能够根据上下文进行推导。

  • 函数式接口是 Lambda 的基础,而方法引用是 Lambda 的孪生兄弟。

2.4经过对象名引用成员方法

//对象名 引用成员方法的引用

public class Test7 {

    public static void main(String[] args) {

        String str="LIWENJIE";

        //skips(()->str.toLowerCase());

        //转换为小写

        skips(str::toLowerCase);

    }

    public static  void skips(Supplier<String>supplier){

        String  ss=supplier.get();

        System.out.println(ss);

    }

}

 

2.5经过类名引用静态方法

 

//经过类名静态方法的引用

public class Test8 {

    public static void main(String[] args) {

         display(Math::random);

         display(()->Math.random());

    }

    public static  void display(Supplier<Double>set) {

       double  aa=set.get();

        System.out.println(aa);

    }

}

 

2.6经过Super关键字引用成员方法

若是存在继承关系,当 Lambda 中须要出现 super 调用时,也可使用方法引用进行替代。

首先定义一个函数式接口

//Super引用成员方法

public class Test9 {

    public static void main(String[] args) {

        //建立当前类的对象

        F1  ff=new F1();

        ff.apple();

    }

 

}

interface  inface1{

    void  meth();

}

//建立父类

class  F1{

    public  void  apple(){

        System.out.println("李文杰");

    }

}

//建立子类

class S1  extends  F1{

    @Override

    public void apple() {

        System.out.println("天水市");

    }

    //定义方法

    public  void apple1(inface1 inface11){

        inface11.meth();

    }

    //引用当前类父类的方法

    public  void apple2(){

      //引用当前类父类的方法

       apple1(super::apple);

        //引用当前类的方法

       apple1(this::apple);

    }

 

}

2.7经过 this 引用成员方法

//this引用成员方法

public class Test10 {

    public static void main(String[] args) {

        Myshe  ss=new Myshe();

        ss.method();

    }

}

interface  my{

    void  test();

}

class Myshe{

    public void meth(my  ss){

        ss.test();

    }

    public void  skip(){

        System.out.println("我是成员方法");

    }

    //引用成员方法

public  void method(){

  //Lambda表达式的写法

meth(()->this.skip());

//方法的引用

        meth(this::skip);

    }

}

相关文章
相关标签/搜索