当前位置: 首页 > 图灵资讯 > java面试题> 怎么理解Java里面的双冒号“::”

怎么理解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
    }
}