doc: update docs/java.md #628
This commit is contained in:
		
							
								
								
									
										153
									
								
								docs/java.md
									
									
									
									
									
								
							
							
						
						
									
										153
									
								
								docs/java.md
									
									
									
									
									
								
							@@ -1307,6 +1307,94 @@ Method[] methods = clazz.getDeclaredMethods();
 | 
			
		||||
Annotation annotation = field.getAnnotation(MyAnnotation.class);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
方法引用
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
### 方法引用
 | 
			
		||||
<!--rehype:wrap-class=row-span-3-->
 | 
			
		||||
 | 
			
		||||
Java 的 `Consumer` 接口里的 `accept` 方法接受参数但不返回值。要让它打印传入的参数,可以这样做:
 | 
			
		||||
 | 
			
		||||
```java
 | 
			
		||||
Consumer<String> test = new Consumer<String>() {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void accept(String s) {
 | 
			
		||||
      System.out.println(s);
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
test.accept("test");
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
更简单的,我们可以直接传入Lambda表达式
 | 
			
		||||
 | 
			
		||||
```java
 | 
			
		||||
Consumer<String> test = System.out::println;
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
方法引用通过方法的名字指向一个方法,使语言构造更简洁,减少冗余代码。
 | 
			
		||||
 | 
			
		||||
#### 使用方式
 | 
			
		||||
 | 
			
		||||
- 引用方法
 | 
			
		||||
- 引用构造方法
 | 
			
		||||
- 引用数组
 | 
			
		||||
 | 
			
		||||
### 静态方法引用
 | 
			
		||||
 | 
			
		||||
```java
 | 
			
		||||
Comparator<Integer> comparator = Math::max;
 | 
			
		||||
 | 
			
		||||
int result = comparator.compare(1, 2); 
 | 
			
		||||
// 返回 2
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### 实例方法引用
 | 
			
		||||
 | 
			
		||||
```java
 | 
			
		||||
String str = "HELLO";
 | 
			
		||||
 | 
			
		||||
String lowerCase = str::toLowerCase; 
 | 
			
		||||
// 返回 "hello"
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### 构造方法引用
 | 
			
		||||
 | 
			
		||||
```java
 | 
			
		||||
Supplier<String> supplier = String::new;
 | 
			
		||||
 | 
			
		||||
String str = supplier.get(); 
 | 
			
		||||
// 返回一个空字符串
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### 数组构造方法引用
 | 
			
		||||
 | 
			
		||||
```java
 | 
			
		||||
Function<Integer, String[]> function = String[]::new;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
String[] array = function.apply(5); 
 | 
			
		||||
// 返回 5 个空字符串的数组
 | 
			
		||||
```
 | 
			
		||||
<!--rehype:className=wrap-text-->
 | 
			
		||||
 | 
			
		||||
### 对象中的方法引用
 | 
			
		||||
 | 
			
		||||
```java
 | 
			
		||||
String someStr = "HELLO";
 | 
			
		||||
 | 
			
		||||
String lowerCase = someStr::toLowerCase; 
 | 
			
		||||
// 返回 "hello"
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### 对象中的静态方法引用
 | 
			
		||||
 | 
			
		||||
```java
 | 
			
		||||
SomeClass someObject = new SomeClass();
 | 
			
		||||
 | 
			
		||||
int result = someObject::staticMethod; 
 | 
			
		||||
// 调用静态方法
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
杂项 Misc
 | 
			
		||||
----
 | 
			
		||||
 | 
			
		||||
@@ -1470,71 +1558,6 @@ int frequency = Collections
 | 
			
		||||
      .frequency(list, 2); // frequency = 2
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### 方法引用
 | 
			
		||||
<!--rehype:wrap-class=col-span-2-->
 | 
			
		||||
有一种函数式接口叫做`Consumer`,里面有个抽象方法`accept`能够接受一个参数但是没有返回值,加入我想实现这个方法,让他打印我传入的参数,那么我可以这样:
 | 
			
		||||
 | 
			
		||||
```java
 | 
			
		||||
Consumer<String> test = new Consumer<String>() {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void accept(String s) {
 | 
			
		||||
      System.out.println(s);
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
test.accept("test");
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
更简单的,我们可以直接传入Lambda表达式
 | 
			
		||||
 | 
			
		||||
```java
 | 
			
		||||
Consumer<String> test = System.out::println;
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
这就是方法引用,方法引用通过方法的名字来指向一个方法,让语言的构造更紧凑简洁,减少冗余代码。
 | 
			
		||||
 | 
			
		||||
#### 使用方式
 | 
			
		||||
 | 
			
		||||
- 引用方法
 | 
			
		||||
- 引用构造方法
 | 
			
		||||
- 引用数组
 | 
			
		||||
 | 
			
		||||
#### 引用方式
 | 
			
		||||
 | 
			
		||||
- 实例对象::实例方法名
 | 
			
		||||
 | 
			
		||||
```java
 | 
			
		||||
Consumer<String> myConsumer = System.out::println;
 | 
			
		||||
myConsumer.accept("test");
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
- 类名::静态方法名
 | 
			
		||||
 | 
			
		||||
```java
 | 
			
		||||
Function<Long, Long> myFunction = Math::abs(x);
 | 
			
		||||
Long result = myFunction.apply("-2L");
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
- 类名::实例方法名
 | 
			
		||||
 | 
			
		||||
```java
 | 
			
		||||
BiPredicate<String, String> myBiPredicate = String::equals;
 | 
			
		||||
System.out.println(myBiPredicate.test("test", "test"));
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
- 引用构造器
 | 
			
		||||
 | 
			
		||||
```java
 | 
			
		||||
Function<Integer, String> myFunction = StringBuffer::new;
 | 
			
		||||
StringBuffer sb = myFunction.apply(10);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
- 引用数组
 | 
			
		||||
 | 
			
		||||
```java
 | 
			
		||||
Function<Integer, int[]> myFunction = int[]::new;
 | 
			
		||||
int []arr = myFunction.apply(123);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
另见
 | 
			
		||||
---
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user