方法引用
方法引用
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 }