Collections.emptyList() 和 Collections::emptyList 有什么区别

What is the difference between Collections.emptyList() vs Collections::emptyList

使用 java 流时编码时显示错误

Optional.ofNullable(product.getStudents())
                .orElseGet(Collections.emptyList())
                .stream().map(x->x.getId)
                .collect(Collectors.toList());

此代码显示以下错误 错误

incompactible type, Required Supplier> but empty list was interfered to List : no instance of type variable of T exist so List conforms to Supplier>

但是如果我用 Collections::emptyList 替换 Collections.emptyList() 会很完美的。

Collections.emptyList() 和 Collections::emptyList 有什么区别?

Collections.emptyList()是returns一个List<T>static方法,即表达式Collections.emptyList()将执行emptyList()方法及其值将是 List<T>。因此,您只能将该表达式传递给需要 List 参数的方法。

Collections::emptyList是一个方法引用,可以实现一个功能接口,其单个方法具有匹配的签名。

A Supplier<List<T>> 是一个函数式接口,它有一个 returns 和 List<T> 的方法,它与 Collections.emptyList() 的签名相匹配。因此,一个方法 - 例如 OptionalorElseGet(Supplier<? extends T> other) - 在你的例子中需要一个 Supplier<? extends List<Student>> - 可以接受方法引用 Collections::emptyList,它可以实现该接口。

:: operator is shorthand for lambdas calling a specific method – by name.它当然是更具可读性的语法。

它也可以与实例方法的静态一起使用。

对于静态: Collections::emptyList

例如: System.out::打印