方法引用

方法引用

1. 通过new出类的对象来引用方法

例:

(1)传统方式实现字符串转大写

①定义一个print接口

1 package cn.itcast.day_16;
2 
3 @FunctionalInterface
4 public interface Printable {
5 
6     //打印字符串
7     void print(String s);
8 }

②定义一个字符串转换类

1 package cn.itcast.day_16;
2 
3 public class MethodTest {
4     public void printupper(String str){
5         String s = str.toUpperCase();
6         System.out.println(s);
7     }
8 }

③主函数

 1 package cn.itcast.day_16;
 2 
 3 public class DemoPrintable {
 4 
 5     public static void printString(Printable printable){
 6         printable.print("hello");
 7     }
 8 
 9     public static void main(String[] args) {
10         printString((String s)->{
11             //创建methodTest对象
12             MethodTest obj = new MethodTest();
13             obj.printupper(s);
14         });
15     }
16 }

 

注意: 1.对象是存在的

    2.成员方法也是存在的

   3.所以可以使用方法引用

 

(2)使用方法引用

 1 package cn.itcast.day_16;
 2 
 3 public class DemoPrintable {
 4 
 5     public static void printString(Printable printable){
 6         printable.print("hello");
 7     }
 8 
 9     public static void main(String[] args) {
10 
11         MethodTest obj = new MethodTest();
12         //使用对象引用方法
13         printString(obj::printupper);
14     }
15 }

2. 通过类名引用静态方法

①该方法为静态方法

1 package cn.itcast.day_16;
2 
3 public class MethodTest {
4     public static void printupper(String str){
5         String s = str.toUpperCase();
6         System.out.println(s);
7     }
8 }

②主函数

 1 package cn.itcast.day_16;
 2 
 3 public class DemoPrintable {
 4 
 5     public static void printString(Printable printable){
 6         printable.print("hello");
 7     }
 8 
 9     public static void main(String[] args) {
10 
11         //使用对象引用方法
12         printString(MethodTest::printupper);
13     }
14 }

3. 通过super引用成员方法

 ①定义一个父类

1 package cn.itcast.day_18;
2 
3 //父类
4 public class Human {
5     //定义一个sayhello方法
6     public void sayHello(){
7         System.out.println("hello,我是human");
8     }
9 }

②定义一个接口

1 package cn.itcast.day_18;
2 
3 @FunctionalInterface
4 public interface greetable {
5     //定义见面的方法
6     void greet();
7 }

③定义一个字类

 1 package cn.itcast.day_18;
 2 
 3 public class Man extends Human{
 4     @Override
 5     public void sayHello() {
 6         System.out.println("hello,我是Man");
 7     }
 8 
 9     public void method(greetable greetable){
10         greetable.greet();
11     }
12 
13     public void show(){
14         //因为有子夫类关系,所以存在一个关键字super代表父,直接使用super调用父类的成员方法
15         method(()->{
16             super.sayHello();
17         });
18         //使用super引用父类成员方法
19         //super存在,父类方法也存在,使用super引用父类方法
20         method(super::sayHello);
21     }

④主函数

1 public static void main(String[] args) {
2         new Man().show();
3     }

4.使用this引用本类中的方法

①定义一个接口

1 package cn.itcast.day_19;
2 
3 @FunctionalInterface
4 public interface Richable {
5     void buy();
6 }

②定义一个类

 1 package cn.itcast.day_19;
 2 
 3 import cn.itcast.day_18.Human;
 4 
 5 public class Husband {
 6     public void buyHouse(){
 7         System.out.println("买房子");
 8     }
 9 
10     public void marry(Richable r){
11         r.buy();
12     }
13 
14     public void beHappy(){
15         //传统写法
16         marry(()->{
17             this.buyHouse();
18         });
19 
20         //使用this引用本类中的方法
21         marry(this::buyHouse);
22     }
23 }

5. 使用new来引用类中的带参构造方法

①生成一个类Person

 1 package cn.itcast.day_20;
 2 
 3 public class Person {
 4     private String name;
 5 
 6     public String getName() {
 7         return name;
 8     }
 9 
10     public void setName(String name) {
11         this.name = name;
12     }
13 
14     public Person() {
15     }
16 
17     public Person(String name) {
18         this.name = name;
19     }
20 }

②生成一个Person对象的函数式接口

1 package cn.itcast.day_20;
2 
3 //创建person对象的函数式接口
4 public interface PersonBulider {
5     Person BuliderPerson(String name);
6 
7 }

③生成一个测试类

 1 package cn.itcast.day_20;
 2 
 3 public class Demo {
 4     //类的构造器
 5     public static void printName(String name,PersonBulider pb){
 6         Person person = pb.BuliderPerson(name);
 7         System.out.println(person.getName());
 8     }
 9 
10     public static void main(String[] args) {
11         //传统方法
12         printName("aaa",(String name)->{
13             return new Person(name);
14         });
15 
16         /**
17          * Person已知
18          * Person类的带参构造方法已知
19          * 就可以使用Person引用new来引用person的带参构造方法
20          */
21         printName("aa",Person::new);
22     }
23 }

6. 使用new来引用数组构造方法

①定义一个创建数组的函数式接口

1 package cn.itcast.day_21;
2 
3 //定义一个创建数组的函数式接口
4 @FunctionalInterface
5 public interface ArrayBuilder {
6     int[] buildArray(int length);
7 }

②测试类

 1 package cn.itcast.day_21;
 2 
 3 public class test {
 4     public static int[] create(int length, ArrayBuilder ab){
 5         return ab.buildArray(length);
 6     }
 7 
 8     public static void main(String[] args) {
 9         //传统方法
10         int[] arr1 = create(10, (int len) -> {
11             return new int[len];
12         });
13         System.out.println(arr1.length);
14 
15         //使用方法引用
16         int[] arr2 = create(10, int[]::new);
17         System.out.println(arr2.length);
18     }
19 }

 

posted @ 2020-05-31 10:27  不溶解的糖  阅读(217)  评论(0编辑  收藏  举报