• 方法引用


    方法引用

    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 }
  • 相关阅读:
    windows蓝屏错误小全
    大数据量下高并发同步的讲解(不看,保证你后悔)
    本地或者服务器同时启动2个或多个tomcat
    如何在同一系统里同时启动多个Tomcat
    Java配置----JDK开发环境搭建及环境变量配置
    Tomcat8内置jdk8运行环境发布web项目
    Tomcat 部署项目的三种方法
    Java Web(五) JSP详解(四大作用域九大内置对象等)
    Java 四大作用域总结
    JSP九大隐式对象
  • 原文地址:https://www.cnblogs.com/nnnnbbbb1/p/12996613.html
Copyright © 2020-2023  润新知