![[Pasted image 20241122092740.png]]

  • 用于简化匿名内部类的书写
  • 使用条件:只能简化函数式接口的匿名内部类.
  • 函数式接口:只有一个抽象方法的接口.
  • 函数式接口上面一般都有一个注解:@FunctionalInterface,有这个注解的接口一定是函数式接口
	package Warren;  
  
interface Swim{  
    void swim();  
}  
  
public class Main {  
    public static void main(String[] args) {  
      Swim a = new Swim() {  
          public void swim() {  
              System.out.println("a swim");  
          }  
      };  
        Swim b=()->{  
          System.out.println("b swim");  
        };  
        //简化后:Swim b=()-> System.out.println("b swim");
        b.swim();  
    }
省略规则:

![[Pasted image 20241122094227.png]]

方法引用:

  • 进一步简化 Lambda 表达式. 尤其是当 Lambda 表达式仅调用一个方法时.

  • 基本语法:

ClassName::methodName
//或者
instance::methodName
1. 静态方法引用
  • 概念:直接引用类的静态方法。格式:ClassName::staticMethodName
import java.util.Arrays;
import java.util.List;

public class MethodReferenceExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Tom", "Jerry", "Mickey", "Donald");

        // 使用 Lambda 表达式
        names.forEach(name -> System.out.println(name));

        // 使用方法引用
        names.forEach(System.out::println);  // 静态方法引用
    }
}

System.out::printlnSystem.outPrintStream 类型)的 println 方法的引用,直接引用了静态方法。

2. 实例方法引用(特定对象)
  • 概念:引用某个对象的实例方法。格式是:instance::instanceMethodName
import java.util.Arrays;
import java.util.List;

public class MethodReferenceExample {
    public void printName(String name) {
        System.out.println(name);
    }

    public static void main(String[] args) {
        List<String> names = Arrays.asList("Tom", "Jerry", "Mickey", "Donald");

        MethodReferenceExample obj = new MethodReferenceExample();

        // 使用 Lambda 表达式
        names.forEach(name -> obj.printName(name));

        // 使用方法引用
        names.forEach(obj::printName);  // 实例方法引用
    }
}
3. 实例方法引用(任意对象)
  • 概念:引用某个类的任意对象的实例方法。语法格式是:ClassName::instanceMethodName
示例:
import java.util.Arrays;
import java.util.List;

public class MethodReferenceExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Tom", "Jerry", "Mickey", "Donald");

        // 使用 Lambda 表达式
        names.sort((a, b) -> a.compareTo(b));

        // 使用方法引用
        names.sort(String::compareTo);  // 实例方法引用(任意对象)
        
        // 输出排序后的名字
        names.forEach(System.out::println);
    }
}

String::compareTo 引用了 String 类的实例方法 compareTo。这里 names.sort 会调用每个元素的 compareTo 方法进行排序。

4. 构造方法引用

通过方法引用来调用类的构造方法。格式是:ClassName::new

import java.util.function.Function;

public class MethodReferenceExample {
    public static void main(String[] args) {
        // 使用 Lambda 表达式
        Function<String, StringBuilder> lambda = s -> new StringBuilder(s);

        // 使用构造方法引用
        Function<String, StringBuilder> methodRef = StringBuilder::new;

        StringBuilder sb1 = lambda.apply("Hello");
        StringBuilder sb2 = methodRef.apply("World");

        System.out.println(sb1);  // 输出 "Hello"
        System.out.println(sb2);  // 输出 "World"
    }
}
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐