Skip to content

Commit

Permalink
doc: update docs/java.md #628
Browse files Browse the repository at this point in the history
  • Loading branch information
jaywcjlove committed May 5, 2024
1 parent 22ecbc5 commit 4d638b2
Showing 1 changed file with 88 additions and 65 deletions.
153 changes: 88 additions & 65 deletions docs/java.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
----

Expand Down Expand Up @@ -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);
```

另见
---

Expand Down

0 comments on commit 4d638b2

Please sign in to comment.