当前位置: 首页 > news >正文

Java方法引用

2 方法引用

  • 在使用Lambda表达式的时候,我们实际上传递进去的代码就是一种解决方案:拿参数做操作
  • 那么考虑一种情况: 如果我们在Lambda中所指定的操作方案,已经有地方存在相同方案,没有必要再写重复逻辑,如usePrintable(s -> System.out.println(s));中System.out.println(s)就是重复逻辑
  • 可以通过方法引用来使用已经存在的方案

2.1 方法引用符

  • 方法引用符

    • :: 该符号为引用运算符,而它所在的表达式被称为方法引用
  • 对比分析

    • Lambda表达式usePrintable(s -> System.out.println(s));
      分析:拿到参数s之后通过Lambda表达式,传递给System.out.println()方法去处理
    • 方法引用usePrintable(System.out:println);//隐含了把s参数给println方法
      分析:直接使用System.out中的println方法来取代Lambda,代码更加的简洁
  • 推导与省略

    • 如果使用Lambda,那么根据"可推导就是可省略”的原则,无需指定参数类型,也无需指定的重载形式,它们都将被自动推导
    • 如果使用方法引用,也是同样可以根据上下文进行推导
    • 方法引用是Lambda的李生兄弟(可以使用Lambda表达式就可以使用方法引用)
  • 范例

package test;public class Demo {public static void main(String[] args) {//Lambda表达式usePrintable(i -> {System.out.println(i); //888});//方法引用usePrintable(System.out::println); //888}private static void usePrintable(Printable p) {p.printInt(888);}
}

2.2 引用类方法

  • 常用方法引用

    • 引用类方法
    • 引用类的实例方法(成员方法)
    • 引用对象的实例方法
    • 引用构造器
  • 引用类方法,其实就是引用类的静态方法

  • 格式类名::静态方法

  • 范例Integer::parselnt
    Integer类的方法:public static int parseInt(String s)将此String转换为int类型数据

  • 练习
    在这里插入图片描述

  • 接口类

package test;public interface Converter {int convert(String s);
}
  • 测试类
package test;public class Demo {public static void main(String[] args) {
//        useConverter(s -> {
//            return Integer.parseInt(s);
//        });useConverter(s -> Integer.parseInt(s)); //666//引用类方法useConverter(Integer::parseInt); //666//Lambda表达式被类方法替代时,他的形式参数全部传给静态方法做参数;如s字符串传递给parseInt方法}private static void useConverter(Converter c) {int number = c.convert("666");System.out.println(number);}
}

2.3 引用类的实例方法(成员方法)

  • 引用类的实例方法,其实就是引用类中的成员方法

  • 格式类名::成员方法

  • 练习
    在这里插入图片描述

  • 接口

package test;public interface MyString {String mySubString(String s,int x,int y);
}
  • 测试类
package test;public class Demo {public static void main(String[] args) {
//        useMyString((String s,int x,int y)->{
//            return s.substring(x, y); //llo
//        });useMyString((s,x,y)-> s.substring(x, y)); // //llo//引用类中的实例方法useMyString(String::substring); //llo//Lambda表达式中的形式参数(s,x,y)//第一个参数作为调用者//后面的参数全部传给实例方法作为参数}public static void useMyString(MyString m) {String s = m.mySubString("HelloWorld", 2, 5);System.out.println(s);}
}

2.4 引用对象的实例方法(成员方法)

  • 引用对象的实例方法,其实就引用类中的成员方法

  • 格式对象名::成员方法

  • 范例"HelloWorld"::toUpperCase
    String类中的方法:public String toUpperCase()将此String所有字符转换为大写

  • 练习
    在这里插入图片描述

  • PrintString类

package test;public class PrintString {//把字符串转换成大写public void printUpper(String s) {String result = s.toUpperCase();System.out.println(result);}
}
  • 接口
package test;public interface Printer {void printUpperCase(String s);
}
  • 测试类
package test;public class Demo {public static void main(String[] args) {
//        usePrinter((String s ) -> {
            String result = s.toUpperCase();
            System.out.println(result); //HELLO
//            System.out.println(s.toUpperCase());
//        });usePrinter(s -> System.out.println(s.toUpperCase()));//引用对象的实例方法PrintString ps = new PrintString();usePrinter(ps::printUpper); //HELLO}public static void usePrinter(Printer p) {p.printUpperCase("hello");}
}

2.5 引用构造器

  • 引用构造器,就是引用构造方法

  • 格式类名::new

  • 范例Student::new

  • 练习
    在这里插入图片描述

  • 测试类

package test;public class Demo {public static void main(String[] args) {
//        useStudentBuilder((String name,int age) -> {
            Student s  =new Student(name,age);
            return s;
//            return new Student(name,age); //
//        });useStudentBuilder((name, age) -> new Student(name, age));useStudentBuilder(Student::new); //小黑,10//Lambda表达式被引用构造器代替时,他的形式参数全部传递给构造器作为参数}public static void useStudentBuilder(StudentBuilder sb) {Student s = sb.build("小黑", 10);System.out.println(s.getName() + "," + s.getAge());}
}
http://www.lryc.cn/news/14440.html

相关文章:

  • C++教程之迭代器Iterator
  • 容联七陌:ChatGPT大模型能力为智能客服带来新方向
  • 【Linux 多线程同步】使用同步和互斥实现生产消费模型
  • 【TypeScript】TypeScript的接口和对象类型(interface):
  • 7、函数与异常
  • Julia 语言环境安装
  • 5.1 线程
  • 通讯录的实现
  • Urho3D导航
  • 【学习总结】激光雷达与相机外参标定:代码(cam_lidar_calibration)
  • 车载技术开发—{Android CarFrameWork}
  • 多城市二手车买卖发布管理小程序开发
  • 企业级信息系统开发学习笔记1.2 初探Spring——利用组件注解符精简Spring配置文件
  • 37、基于51单片机乒乓球比赛系统设计
  • VMware虚拟机安装Win11最详细过程以及遇到的这台电脑无法运行Windows11的问题
  • centos误删python2后怎么重新安装
  • Qt 开发使用VSCode 笔记2
  • 查找算法复习
  • 腾讯前端必会面试题(必备)
  • 探访上汽通用武汉奥特能超级工厂
  • 【Linux】线程函数和线程同步详细整理(金针菇般细)
  • Python学习笔记6:抽象
  • 自己手写一个redux
  • mysql调优参数
  • JavaEE简单示例——再插入的同时获取插入的主键列
  • sql语句练习
  • 广州蓝景—结合chatGPT下的教育模式变化
  • 大数据框架之Hadoop:MapReduce(三)MapReduce框架原理——shuffle机制
  • 4|无线传感器网络与应用|无线传感器网络原理及方法-许毅版|第3章:无线传感器网络通信-3.1协议结构 3.2物理层|青岛科技大学|课堂笔记
  • 关机时,如何控制systemd服务的关闭顺序