在 Java 语法中 :: 的含义因此,在您的示例中:

2022-09-01 02:16:28

在以下代码中 :: 的含义是什么?

Set<String> set = people.stream()
                        .map(Person::getName)
                        .collect(Collectors.toCollection(TreeSet::new));

答案 1

这是方法参考。在 Java 8 中添加。

TreeSet::new引用 的默认构造函数。TreeSet

通常是指类 中的方法。A::BBA


答案 2

::称为方法引用。它基本上是对单个方法的引用。即,它通过名称引用现有方法。

Method reference using ::是一个方便的运营商。

方法引用是属于 Java lambda 表达式的功能之一。方法引用可以用通常的lambda表达式语法格式来表示,为了使其更简单,可以使用运算符。–>::

例:

public class MethodReferenceExample {
    void close() {
        System.out.println("Close.");
    }

    public static void main(String[] args) throws Exception {
        MethodReferenceExample referenceObj = new MethodReferenceExample();
        try (AutoCloseable ac = referenceObj::close) {
        }
    }
}

因此,在您的示例中:

Set<String> set = people.stream()
                        .map(Person::getName)
                        .collect(Collectors.toCollection(TreeSet::new));

正在调用/创建“新”树集。

Contstructor 引用的一个类似示例是:

class Zoo {
    private List animalList;
    public Zoo(List animalList) {
        this.animalList = animalList;
        System.out.println("Zoo created.");
    }
}

interface ZooFactory {
    Zoo getZoo(List animals);
}

public class ConstructorReferenceExample {

    public static void main(String[] args) {
        //following commented line is lambda expression equivalent
        //ZooFactory zooFactory = (List animalList)-> {return new Zoo(animalList);};    
        ZooFactory zooFactory = Zoo::new;
        System.out.println("Ok");       
        Zoo zoo = zooFactory.getZoo(new ArrayList());
    }
}