原文: https://howtodoinjava.com/java8/lambda-method-references-example/

Java 8 中,我们可以使用class::methodName类型的语法从类或对象中引用方法。 让我们学习一下 Java 8 中可用的方法引用的不同类型

  1. Table of Contents
  2. 1\. Types of Method References
  3. 2\. Reference to static method - Class::staticMethodName
  4. 3\. Reference to instance method from instance - ClassInstance::instanceMethodName
  5. 4\. Reference to instance method from class type - Class::instanceMethodName
  6. 5\. Reference to constructor - Class::new

1. 方法引用的类型

Java 8 允许四种类型的方法引用。

方法引用 描述 方法引用示例
静态方法的引用 用于从类中引用静态方法 Math::max等同于(x, y) -> Math.max(x,y)
来自实例的实例方法的引用 使用所提供对象的引用来引用实例方法 System.out::println等同于x -> System.out.println(x)
来自类类型的实例方法的引用 在上下文提供的对象的引用上调用实例方法 String::length等同于str -> str.length()
构造器的引用 引用构造器 ArrayList::new等同于() -> new ArrayList()

2. 静态方法的引用 – Class::staticMethodName

使用Math.max()是静态方法的示例。

  1. List<Integer> integers = Arrays.asList(1,12,433,5);
  2. Optional<Integer> max = integers.stream().reduce( Math::max );
  3. max.ifPresent(value -> System.out.println(value));

输出:

  1. 433

3. 来自实例的实例方法的引用 – ClassInstance::instanceMethodName

在上面的示例中,我们使用System.out.println(value)打印找到的最大值。 我们可以使用System.out::println打印该值。

  1. List<Integer> integers = Arrays.asList(1,12,433,5);
  2. Optional<Integer> max = integers.stream().reduce( Math::max );
  3. max.ifPresent( System.out::println );

Output:

  1. 433

4. 来自类类型的实例方法的引用 – Class::instanceMethodName

在此示例中,s1.compareTo(s2)称为String::compareTo

  1. List<String> strings = Arrays
  2. .asList("how", "to", "do", "in", "java", "dot", "com");
  3. List<String> sorted = strings
  4. .stream()
  5. .sorted((s1, s2) -> s1.compareTo(s2))
  6. .collect(Collectors.toList());
  7. System.out.println(sorted);
  8. List<String> sortedAlt = strings
  9. .stream()
  10. .sorted(String::compareTo)
  11. .collect(Collectors.toList());
  12. System.out.println(sortedAlt);

输出:

  1. [com, do, dot, how, in, java, to]
  2. [com, do, dot, how, in, java, to]

5. 构造器的引用 – Class::new

可以更新第一种方法,以创建一个从 1 到 100 的整数列表。使用 lambda 表达式非常简单。 要创建ArrayList的新实例,我们已经使用ArrayList::new

  1. List<Integer> integers = IntStream
  2. .range(1, 100)
  3. .boxed()
  4. .collect(Collectors.toCollection( ArrayList::new ));
  5. Optional<Integer> max = integers.stream().reduce(Math::max);
  6. max.ifPresent(System.out::println);

输出:

  1. 99

这是 Java 8 lambda 增强特性中的方法引用的 4 种类型

学习愉快!