# Java 8 方法引用示例

> 原文： [https://howtodoinjava.com/java8/lambda-method-references-example/](https://howtodoinjava.com/java8/lambda-method-references-example/)

在 [Java 8](//howtodoinjava.com/java-8-tutorial/) 中，我们可以使用`class::methodName`类型的语法从类或对象中引用方法。 让我们学习一下 Java 8 中可用的**方法引用的不同类型**。

```java
Table of Contents

1\. Types of Method References
2\. Reference to static method - Class::staticMethodName
3\. Reference to instance method from instance - ClassInstance::instanceMethodName
4\. Reference to instance method from class type - Class::instanceMethodName
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()`是静态方法的示例。

```java
List<Integer> integers = Arrays.asList(1,12,433,5);

Optional<Integer> max = integers.stream().reduce( Math::max ); 

max.ifPresent(value -> System.out.println(value)); 

```

输出：

```java
433
```

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

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

```java
List<Integer> integers = Arrays.asList(1,12,433,5);

Optional<Integer> max = integers.stream().reduce( Math::max ); 

max.ifPresent( System.out::println ); 

```

Output:

```java
433
```

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

在此示例中，`s1.compareTo(s2)`称为`String::compareTo`。

```java
List<String> strings = Arrays
		.asList("how", "to", "do", "in", "java", "dot", "com");

List<String> sorted = strings
		.stream()
		.sorted((s1, s2) -> s1.compareTo(s2))
		.collect(Collectors.toList());

System.out.println(sorted);

List<String> sortedAlt = strings
		.stream()
		.sorted(String::compareTo)
		.collect(Collectors.toList());

System.out.println(sortedAlt);

```

输出：

```java
[com, do, dot, how, in, java, to]
[com, do, dot, how, in, java, to]
```

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

可以更新第一种方法，以创建一个从 1 到 100 的整数列表。使用 [lambda 表达式](//howtodoinjava.com/java8/complete-lambda-expressions-tutorial-in-java/)非常简单。 要创建`ArrayList`的新实例，我们已经使用`ArrayList::new`。

```java
List<Integer> integers = IntStream
				.range(1, 100)
				.boxed()
				.collect(Collectors.toCollection( ArrayList::new ));

Optional<Integer> max = integers.stream().reduce(Math::max); 

max.ifPresent(System.out::println); 

```

输出：

```java
99
```

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

学习愉快！