Java的方法引用

0 阅读2分钟

静态方法引用

  • 方法引用:在某些特殊场景下,直接引用某个类或者对象中的方法。语法是 类名/对象名::方法
  • 静态方法引用语法: 类名::静态方法
  • 使用场景
    • 如果某个Lambda表达式里只是调用一个静态方法,并且“→”前后参数的形式一致,就可以使用静态方法引用。
    //定义一个Double类型数组,保存5个小数
    Double[] arr={182.5,165.5,177.5,170.5,180.5};
    //对数组中的小数按照升高进行降序排序
    //Arrays.sort(arr, (o1, o2) -> Double.compare(o1,o2));
    Arrays.sort(arr, Double::compare);
    

实例方法引用

  • 对象名::实例方法。
  • 使用场景
    • 如果Lambda表达式里只是通过对象名称调用一个实例方法,并且“→”前后参数的形式一致,就可以使用实例方法引
    ArrayList<String> list = new ArrayList<>();
    list.add("张益达");
    list.add("王大锤");
    list.add("李大壮");
    list.add("王小花");
    //list.forEach(s -> System.out.println(s));
    PrintStream out = System.out;// 一个System对象
    //list.forEach(s -> out.println(s));
    list.forEach(out::println); //也可以写成list.forEach(System.out::println);
    
    • 这里的System.out实际上是是在引用一个系统早就为你创建好的、现成的对象。
      • 可以把 Java 源码里的 System 类想象成这样(简化版):
      public final class System {
          // 这是一个静态的常量,类型是 PrintStream
          public static final PrintStream out; 
      
          // ... 其他代码
      }
      
      • 当你运行 Java 程序时,JVM(Java 虚拟机)在启动阶段就会加载 System 类。在加载的过程中,JVM 底层会自动帮你实例化(创建)这个 PrintStream 对象,并把它赋值给 out。这个对象负责将数据输出到控制台(标准输出流)。
      • 在代码里写下 System.out 时,会获取并使用 JVM 启动时就准备好的那个全局唯一的打印流对象。
      • 所以也可以简写为
      ArrayList<String> list = new ArrayList<>();
      list.add("张益达");
      list.add("王大锤");
      list.add("李大壮");
      list.add("王小花");
      //list.forEach(s -> System.out.println(s));
      list.forEach(System.out::println); 
      //也可以写成list.forEach(System.out::println);