怎么理解Java里面的双冒号“::”
2024-02-21 10:47:46
“::”是什么含义
在Java中,双冒号"::"是方法引用(Method Reference)的语法。方法引用是一种简化Lambda表达式的语法结构,使代码更加简洁易读。并且在使用方法引用时,会根据上下文推断参数类型,因此特别适用于直接引用已有方法的情况。
“::”用法
方法引用的一般形式是:
ClassName::methodName
其中,ClassName 是包含静态方法 methodName 的类名。根据引用的方法类型,有不同的情况:
1. 静态方法引用
假设我们有一个自定义的工具类MathUtil,其中包含一个静态方法square,用于计算一个整数的平方。现在我们想要计算一个整数列表中所有元素的平方和。
import java.util.Arrays;
import java.util.List;
public class MathUtil {
public static int square(int num) {
return num * num;
}
public static void main(string[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream()
.mapToInt(MathUtil::square)
.sum();
System.out.println(sum); // 输出55
}
}
在上述代码中,我们通过使用静态方法引用MathUtil::square,将square方法传递给mapToInt方法,以便对列表中的每个元素进行平方运算。
2. 实例方法引用
假设我们有一个字符串列表,我们想要按照字符串长度进行排序。我们可以使用Lambda表达式编写比较器,也可以使用实例方法引用简化代码。
import java.util.Arrays;
import java.util.List;
public class StringSorter {
public static void main(String[] args) {
List<String> words = Arrays.asList("apple", "orange", "banana", "pear");
words.sort((a, b) -> a.compareTo(b)); // 使用Lambda表达式
System.out.println(words); // [apple, banana, orange, pear]
// 使用实例方法引用
words.sort(String::compareTo);
System.out.println(words); // [apple, banana, orange, pear]
}
}
在上述代码中,我们首先使用Lambda表达式编写了一个比较器(a, b) -> a.compareTo(b)来进行字符串比较。然后,我们使用实例方法引用String::compareTo来简化比较器的写法。
3. 对象方法引用
假设我们有一个自定义的Person类,其中包含姓名和年龄属性。我们想要根据Person对象的年龄进行排序。
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
public class PersonSorter {
public static void main(String[] args) {
List<Person> people = Arrays.asList(
new Person("Alice", 22),
new Person("Bob", 32),
new Person("Charlie", 20),
new Person("David", 26)
);
// 使用Lambda表达式编写比较器
people.sort((p1, p2) -> p1.getAge() - p2.getAge());
System.out.println(people);
// 使用对象方法引用
people.sort(Person::compareByAge);
System.out.println(people);
}
}
static class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return name + " (" + age + ")";
}
public static int compareByAge(Person p1, Person p2) {
return p1.getAge() - p2.getAge();
}
}
在上述代码中,我们首先使用Lambda表达式编写了一个比较器(p1, p2) -> p1.getAge() - p2.getAge()来根据年龄进行排序。然后,我们使用对象方法引用Person::compareByAge来简化比较器的写法。
4. 构造方法引用
假设我们需要创建一个空的ArrayList,可以使用构造方法引用来实现。
import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;
public class ArrayListCreator {
public static void main(String[] args) {
Supplier<List<String>> supplier = ArrayList::new;
List<String> list = supplier.get();
System.out.println(list instanceof ArrayList); // 输出true
}
}