• [java进阶]——方法引用改写Lambda表达式


    🌈键盘敲烂,年薪30万🌈

    目录

    📕概念介绍:

    ⭐方法引用的前提条件:

    1.引用静态方法

    2.引用构造方法

    ①类的构造:

    ②数组的构造:

    3.引用本类或父类的成员方法

    ①本类:

    ①父类:

    4.引用其他类的方法

    5.特定类的方法引用

    🐒总结


    📕概念介绍:

    方法引用改写Lambda表达式可简化代码书写,方法引用就是调用已经拥有的方法,学习方法引用是必要的,在java的原码中你会经常看到它,在以后mybatis-plus的学习中会大量使用方法引用。

    方法引用的前提条件:

    • 拥有函数式接口
    • 存在引用方法
    • 引用方法同抽象方法的作用相同
    • 引用的方法的形参和返回值类型要与抽象方法保持一致

    1.引用静态方法

    格式:类名::方法名

    代码实现:

    1. //将集合中的元素转化为int类型并打印
    2. List list = new ArrayList<>();
    3. Collections.addAll(list, "2", "5", "4", "10");
    4. //Lambda方法
    5. list.stream().map(new Function() {
    6. @Override
    7. public Integer apply(String s) {
    8. return Integer.parseInt(s);
    9. }
    10. }).forEach(System.out::println);*/
    11. //方法引用
    12. list.stream().map(Integer::parseInt).forEach(System.out::print);

    2.引用构造方法

    ①类的构造:

        格式:类名::new

        注意:类里面要有对应的构造方法(参数名与抽象方法保持一致)

    代码实现:

    1. //将集合里面的字符串封装称user对象
    2. //原始写法
    3. ArrayList list = new ArrayList<>();
    4. Collections.addAll(list, "张无忌,18", "小昭,19");
    5. /*List collect = list.stream().map(new Function() {
    6. @Override
    7. public User apply(String s) {
    8. String[] split = s.split(",");
    9. return new User(split[0], Integer.parseInt(split[1]));
    10. }
    11. }).collect(Collectors.toList());
    12. System.out.println(collect);*/
    13. //引用构造方法
    14. //类名::new
    15. List newlist = list.stream().map(User::new).collect(Collectors.toList());
    ②数组的构造:

        格式:数据类型名[]::new

    代码实现:

    1. //数组的构造方法
    2. ArrayList list = new ArrayList<>();
    3. Collections.addAll(list, 1, 2, 3, 4);
    4. //原始方法
    5. Integer[] array = list.stream().toArray(new IntFunction() {
    6. @Override
    7. public Integer[] apply(int value) {
    8. return new Integer[value];
    9. }
    10. });
    11. //方法引用
    12. Integer[] array1 = list.stream().toArray(Integer[]::new);

    3.引用本类或父类的成员方法

    ①本类:

        格式:this::方法名 (前提:非静态)

        注意:被引用方法一定不要是静态的,因为静态里面没有this和super关键字

    代码实现:

    1. //升序排序
    2. public void testmethod1(){
    3. List list = new ArrayList<>();
    4. Collections.addAll(list, 1, 2, 3, 4, 5);
    5. // 引用本类中非静态的 this::方法名
    6. list.stream().sorted(this::method1).forEach(System.out::print);
    7. }
    8. public int method1(int o1, int o2){
    9. return o2 - o1;
    10. }
    ①父类:

        格式:super::方法名(前提:非静态)

    代码实现:

    同上只是将this改为了super

    4.引用其他类的方法

    格式:对象名::方法名

    1. public static void main(String[] args) {
    2. //将集合中的数据封装成User对象
    3. //引用其他类型的方法
    4. ArrayList list = new ArrayList<>();
    5. Collections.addAll(list, "张无忌,18", "小昭,19");
    6. List newlist = list.stream().map(new Utils()::method).collect(Collectors.toList());
    7. System.out.println(newlist);
    8. }

    5.特定类的方法引用

    格式:类::方法名

    注意:抽象方法的形参从第二个开始到最后与引用方法保持一致,第一个形参用于指明是什么类

    代码演示:

    1. // 将字母转为大写
    2. //原始方法
    3. ArrayList list = new ArrayList<>();
    4. Collections.addAll(list, "aaa", "bbb", "ccc");
    5. List collect = list.stream().map(new Function() {
    6. @Override
    7. public String apply(String s) {
    8. return s.toUpperCase();
    9. }
    10. }).collect(Collectors.toList());
    11. System.out.println(collect);
    12. //方法引用
    13. //类名::方法名
    14. //局限:只能引用抽象方法中第一个参数类型里面的方法
    15. //就像这里只能引用string里面的方法
    16. //注意 被引用方法的第二个到最后一个形参要与抽象方法保持一致
    17. List newlist = list.stream().map(String::toUpperCase).collect(Collectors.toList());

    🐒总结

  • 相关阅读:
    Android入门第30天-Android里的Toast的使用
    【鸿蒙应用开发系列】- 事件订阅者CommonEventSubscriber使用
    Linux:进程管理 | 进程创建 | 进程终止 | 进程等待 | 进程替换
    无线传感器网络:定位、安全与同步
    C++个人财务管理系统
    高速DSP系统设计参考指南(四)DSP电源设计
    Word控件Spire.Doc 【段落处理】教程(十四):如C#/VB.NET:删除 Word 中的空行
    多线程并发、线程池、同步方法、同步代码块(锁)
    cy.visit 执行逻辑的单步调试
    神经网络适用于什么问题,对神经网络的简单理解
  • 原文地址:https://blog.csdn.net/Panci_/article/details/134275239