美文网首页
158. Java Lambda 表达式 - 构造函数方法引用的

158. Java Lambda 表达式 - 构造函数方法引用的

作者: Cache技术分享 | 来源:发表于2025-08-12 09:04 被阅读0次

158. Java Lambda 表达式 - 构造函数方法引用的使用与实践

构造函数方法引用 是一种特殊的方式,它允许通过引用构造函数来创建对象。这种方法引用的语法与其他方法引用略有不同,因为构造函数本身并不是一个普通的方法,但我们依然可以通过方法引用来调用它。

1. 构造函数方法引用概述

构造函数方法引用是一种特殊的引用类型,它允许你直接引用类的构造函数。构造函数方法引用的基本语法如下:

ClassName::new

这种方式与普通方法引用类似,但由于构造函数不是普通的方法,所以它属于构造函数方法引用。

2. 基本示例

假设你有以下 Supplier 示例,它是一个返回空 ArrayList 的 lambda 表达式:

Supplier<List<String>> newListOfStrings = () -> new ArrayList<>();

这个 lambda 表达式可以被视为对 ArrayList 空构造函数的引用,你可以通过构造函数方法引用来简化它:

Supplier<List<String>> newListOfStrings = ArrayList::new;

在这个例子中,ArrayList::new 是构造函数方法引用,它引用了 ArrayList 类的空构造函数。这种写法简洁且清晰。

3. 使用菱形运算符与泛型类型

如果你想在构造函数方法引用中使用类型参数(比如使用泛型),你可以显式地提供类型参数。示例如下:

Supplier<List<String>> newListOfStrings = ArrayList<String>::new;

在这个例子中,ArrayList<String>::new 明确指定了 ArrayList 的类型为 String。这里不需要使用菱形运算符,因为类型已经通过构造函数方法引用提供。

4. 构造函数方法引用的应用

构造函数方法引用通常用于需要生成对象的场景。比如在使用 Supplier 或者某些方法需要返回对象的场合。

考虑以下两个不同的构造函数引用示例:

  • 空构造函数引用:

    Supplier<List<String>> newListOfStrings = ArrayList::new;
    

    这是一个常见的构造函数引用,用于创建一个新的空 ArrayList

  • 带参数构造函数引用:

    Function<Integer, List<String>> newListOfNStrings = size -> new ArrayList<>(size);
    

    这是另一个例子,使用了带参数的构造函数。这里 new ArrayList<>(size) 使用了一个带大小参数的构造函数来创建一个指定大小的 ArrayList

你可以看到,虽然两者都使用了相同的构造函数方法引用 ArrayList::new,但是它们指向的是不同的构造函数(一个是空构造函数,另一个是带有大小参数的构造函数)。

5. 构造函数方法引用的语法总结

构造函数方法引用的语法通常有以下几种形式:

  • 空构造函数:ClassName::new这种方法引用用于调用类的空构造函数。

  • 带参数的构造函数:ClassName::new 带参数的构造函数方法引用通常与 Function 或其他类型的函数接口结合使用,传递参数给构造函数。

6. 示例:使用构造函数方法引用

  • 创建空列表:

    Supplier<List<String>> newListOfStrings = ArrayList::new;
    List<String> list = newListOfStrings.get();  // 创建一个空的 ArrayList
    
  • 创建带大小参数的列表:

    Function<Integer, List<String>> newListOfNStrings = ArrayList<String>::new;
    List<String> list = newListOfNStrings.apply(10);  // 创建一个大小为 10 的 ArrayList
    

在这两个示例中,newListOfStringsnewListOfNStrings 都使用了构造函数方法引用,但它们引用的是不同的构造函数:一个是 ArrayList 的空构造函数,另一个是带有大小参数的构造函数。

7. 构造函数方法引用与普通方法引用的区别

  • 普通方法引用:用于引用类的普通实例方法或静态方法。

    例如:

    Function<String, Integer> toLength = String::length;
    
  • 构造函数方法引用:专门用于引用构造函数,语法上有所不同,因为构造函数是用于创建对象的。

    例如:

    Supplier<List<String>> newListOfStrings = ArrayList::new;
    

8. 注意事项

  • 构造函数方法引用和普通方法引用类似,但你需要小心区分它们的使用场景,特别是在需要通过构造函数创建对象时。
  • 确保你清楚构造函数引用指向的是哪个构造函数,特别是当构造函数有多个重载时。

练习

  1. 将以下代码转换为构造函数方法引用:

    Supplier<StringBuilder> stringBuilderSupplier = () -> new StringBuilder();
    

    答案:

Supplier<StringBuilder> stringBuilderSupplier = StringBuilder::new;


2. 将以下代码转换为构造函数方法引用:

```java
Function<Integer, List<Integer>> listSupplier = size -> new ArrayList<>(size);

答案:

Function<Integer, List<Integer>> listSupplier = ArrayList<Integer>::new;

总结

  • 构造函数方法引用 提供了一种简洁的方式来引用类的构造函数,用于创建对象。
  • 使用构造函数方法引用时,需要理解构造函数的参数,并确保方法引用指向正确的构造函数。
  • 构造函数方法引用可以与 SupplierFunction 等接口结合使用,帮助我们更清晰地创建对象。

相关文章

  • Java 8 学习笔记

    1. Java 8 1.1 生态 Lambda 表达式函数式接口方法引用 / 构造器引用Stream API接口中...

  • java8

    1.lambda表达式《java8 Lambda表达式简介》 《java8 lambda表达式,方法的引用以及构造...

  • 从0开始复习java(1)

    java语言概述 1、java8的新特性。 重新设计的接口语法,Lambda表达式,方法引用,构造器引用,函数式编...

  • Java 匿名函数、构造方法、构造代码块、方法重载与方法重写

    匿名函数 Java Lambda 表达式(又名闭包(Closure)/匿名函数) 构造方法 构造方法的作用:给对象...

  • lambda构造方法引用

    lambda表达式构造方法引用:使用匿名函数、lambda表达式分别进行测试 1、首先创建student类 2、然...

  • JAVA 8 新特性

    1.JAVA 8 新特性 Lambda表达式:Lambda允许把函数作为一个方法的参数; 方法引用:方法引用提供了...

  • Java 8、Java 9、Java 10 新特性

    Java8 Lambda 表达式:Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中。 方法引用 ...

  • JAVA8有哪些新特性

    java8新功能Lambda 表达式 - 增加函数处理能力到JAVA。 方法引用 - 引用函数由他们名称,而不是直...

  • 新特性5-方法引用

    方法引用使得开发者可以直接引用现存的方法、Java类的构造方法或者实例对象。方法引用和Lambda表达式配合使用,...

  • [Java8]JAVA8 学习

    语言层面 Java8 lambda表达式学习函数编程方法引用(Method References)Optional...

网友评论

      本文标题:158. Java Lambda 表达式 - 构造函数方法引用的

      本文链接:https://www.haomeiwen.com/subject/mnyvojtx.html