java 方法引用与构造器引用
Java 方法引用和构造器引用是 Java 8 引入的重要特性,它们进一步简化了 Lambda 表达式的书写,使得代码更加简洁和易读。下面详细介绍方法引用和构造器引用的概念、用法及示例。
方法引用
方法引用是一种简化 Lambda 表达式的语法糖,它允许通过类名或对象引用直接引用已有方法。方法引用可以替代某些 Lambda 表达式,使得代码更简洁。
语法
方法引用的语法格式如下:
- 引用类的方法:
ClassName::methodName
- 引用对象的方法:
objectReference::methodName
- 引用实例方法:
instanceReference::methodName
- 引用构造器:
ClassName::new
示例
示例 1:引用类的方法
假设有一个 MathUtil
类,其中包含一个静态方法 square
:
public class MathUtil {
public static int square(int x) {
return x * x;
}
}
使用 Lambda 表达式和方法引用:
import java.util.Arrays;
import java.util.List;
public class MethodReferenceExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
// 使用 Lambda 表达式
numbers.stream()
.map(x -> MathUtil.square(x))
.forEach(System.out::println);
// 使用方法引用
numbers.stream()
.map(MathUtil::square)
.forEach(System.out::println);
}
}
示例 2:引用对象的方法
假设有一个 Calculator
类,其中包含一个实例方法 add
:
public class Calculator {
public int add(int a, int b) {
return a + b;
}
}
使用 Lambda 表达式和方法引用:
import java.util.Arrays;
import java.util.List;
public class MethodReferenceExample {
public static void main(String[] args) {
Calculator calculator = new Calculator();
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
// 使用 Lambda 表达式
numbers.stream()
.map(x -> calculator.add(x, 10))
.forEach(System.out::println);
// 使用方法引用
numbers.stream()
.map(x -> calculator::add)
.forEach(System.out::println);
}
}
示例 3:引用实例方法
假设有一个 StringUtil
类,其中包含一个实例方法 reverse
:
public class StringUtil {
public String reverse(String str) {
return new StringBuilder(str).reverse().toString();
}
}
使用 Lambda 表达式和方法引用:
import java.util.Arrays;
import java.util.List;
public class MethodReferenceExample {
public static void main(String[] args) {
List<String> strings = Arrays.asList("hello", "world", "java");
// 使用 Lambda 表达式
strings.stream()
.map(str -> new StringUtil().reverse(str))
.forEach(System.out::println);
// 使用方法引用
strings.stream()
.map(StringUtil::reverse)
.forEach(System.out::println);
}
}
构造器引用
构造器引用是另一种方法引用的形式,用于创建对象的构造器。构造器引用的语法格式如下:
- 引用构造器:
ClassName::new
示例
示例 1:引用构造器
假设有一个 Person
类,其中包含一个构造器:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
使用 Lambda 表达式和构造器引用:
import java.util.Arrays;
import java.util.List;
import java.util.function.Supplier;
public class ConstructorReferenceExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<Integer> ages = Arrays.asList(25, 30, 35);
// 使用 Lambda 表达式
List<Person> people = new ArrayList<>();
for (int i = 0; i < names.size(); i++) {
people.add(new Person(names.get(i), ages.get(i)));
}
// 使用构造器引用
List<Person> people2 = IntStream.range(0, names.size())
.mapToObj(i -> new Person(names.get(i), ages.get(i)))
.collect(Collectors.toList());
// 使用 Supplier
Supplier<Person> supplier = Person::new;
Person person = supplier.get();
}
}
方法引用的常见应用场景
1. 遍历集合
import java.util.Arrays;
import java.util.List;
public class MethodReferenceExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
// 使用方法引用
numbers.forEach(System.out::println);
}
}
2. 字符串处理
import java.util.Arrays;
import java.util.List;
public class MethodReferenceExample {
public static void main(String[] args) {
List<String> strings = Arrays.asList("hello", "world", "java");
// 使用方法引用
strings.stream()
.map(String::toUpperCase)
.forEach(System.out::println);
}
}
3. 数学运算
import java.util.Arrays;
import java.util.List;
public class MethodReferenceExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
// 使用方法引用
int sum = numbers.stream()
.reduce(0, Integer::sum);
System.out.println(sum); // 输出 15
}
}
总结
Java 方法引用和构造器引用是 Java 8 引入的重要特性,它们进一步简化了 Lambda 表达式的书写,使得代码更加简洁和易读。
-
方法引用:用于引用已有方法,可以替代某些 Lambda 表达式,使得代码更简洁。
- 引用类的方法:
ClassName::methodName
- 引用对象的方法:
objectReference::methodName
- 引用实例方法:
instanceReference::methodName
- 引用类的方法:
-
构造器引用:用于引用构造器,简化对象创建。
- 引用构造器:
ClassName::new
- 引用构造器:
通过使用方法引用和构造器引用,可以显著减少代码量,提高代码的可读性和可维护性。掌握这些特性后,可以更好地利用它们来编写高效、简洁的 Java 应用程序。
原文地址:https://blog.csdn.net/yuehua00/article/details/142737421
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!