diff --git a/docs/java.md b/docs/java.md index 1743aa8..cae6fa8 100644 --- a/docs/java.md +++ b/docs/java.md @@ -1307,6 +1307,94 @@ Method[] methods = clazz.getDeclaredMethods(); Annotation annotation = field.getAnnotation(MyAnnotation.class); ``` +方法引用 +--- + +### 方法引用 + + +Java 的 `Consumer` 接口里的 `accept` 方法接受参数但不返回值。要让它打印传入的参数,可以这样做: + +```java +Consumer test = new Consumer() { + @Override + public void accept(String s) { + System.out.println(s); + } + }; +test.accept("test"); +``` + +更简单的,我们可以直接传入Lambda表达式 + +```java +Consumer test = System.out::println; +``` + +方法引用通过方法的名字指向一个方法,使语言构造更简洁,减少冗余代码。 + +#### 使用方式 + +- 引用方法 +- 引用构造方法 +- 引用数组 + +### 静态方法引用 + +```java +Comparator comparator = Math::max; + +int result = comparator.compare(1, 2); +// 返回 2 +``` + +### 实例方法引用 + +```java +String str = "HELLO"; + +String lowerCase = str::toLowerCase; +// 返回 "hello" +``` + +### 构造方法引用 + +```java +Supplier supplier = String::new; + +String str = supplier.get(); +// 返回一个空字符串 +``` + +### 数组构造方法引用 + +```java +Function function = String[]::new; + + +String[] array = function.apply(5); +// 返回 5 个空字符串的数组 +``` + + +### 对象中的方法引用 + +```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 ``` -### 方法引用 - -有一种函数式接口叫做`Consumer`,里面有个抽象方法`accept`能够接受一个参数但是没有返回值,加入我想实现这个方法,让他打印我传入的参数,那么我可以这样: - -```java -Consumer test = new Consumer() { - @Override - public void accept(String s) { - System.out.println(s); - } - }; -test.accept("test"); -``` - -更简单的,我们可以直接传入Lambda表达式 - -```java -Consumer test = System.out::println; -``` - -这就是方法引用,方法引用通过方法的名字来指向一个方法,让语言的构造更紧凑简洁,减少冗余代码。 - -#### 使用方式 - -- 引用方法 -- 引用构造方法 -- 引用数组 - -#### 引用方式 - -- 实例对象::实例方法名 - -```java -Consumer myConsumer = System.out::println; -myConsumer.accept("test"); -``` - -- 类名::静态方法名 - -```java -Function myFunction = Math::abs(x); -Long result = myFunction.apply("-2L"); -``` - -- 类名::实例方法名 - -```java -BiPredicate myBiPredicate = String::equals; -System.out.println(myBiPredicate.test("test", "test")); -``` - -- 引用构造器 - -```java -Function myFunction = StringBuffer::new; -StringBuffer sb = myFunction.apply(10); -``` - -- 引用数组 - -```java -Function myFunction = int[]::new; -int []arr = myFunction.apply(123); -``` - 另见 ---