Java8新特性-方法引用、构造器引用及数组引用-《Java笔记》

admin 2025-10-19 02:36:56 编程 来源:ZONE.CI 全球网 0 阅读模式

Java 方法引用 构造器引用 数组引用

一、方法引用

若Lambda体中的内容有方法已经实现了,可以使用“方法引用”(可以理解为方法引用是Lambda表达式的另外一种表现形式)代替Lambda表达式。方法引用使用一对冒号::,通过方法的名字来指向一个方法。方法引用可以使语言的构造更紧凑简洁,减少冗余代码。以前的Lambda表达式的实现写法

  1. Consumer consumer = (x) -> System.out.println(x);

可以看出Lambda体中的内容已经由println()方法做了实现,那么可以直接引用该方法,而不用再写他的实现进行调用

  1. Consumer<String> consumer = (x) -> System.out.println(x);
  2. consumer.accept("一般的Lambda实现");
  3. Consumer<String> stringConsumer = System.out::println;
  4. stringConsumer.accept("使用同类型的方法进行引用实现");

:::danger 注意:引用的方法必须和函数式接口的参数返回值保持一致性 ::: image.png

语法格式

①对象实例方法引用-对象::实例方法名

  1. // 对象::实例方法名
  2. @Test
  3. public void methodTest() {
  4. Consumer<String> consumer = (x) -> System.out.println(x);
  5. consumer.accept("一般的Lambda实现");
  6. Consumer<String> stringConsumer = System.out::println;
  7. stringConsumer.accept("使用同类型的方法进行引用实现");
  8. // getName()是employee对象的实例方法
  9. Employee employee = new Employee("Fcant", 16, 1600);
  10. Supplier<String> stringSupplier = employee::getName;
  11. System.out.println(stringSupplier.get());
  12. }

②静态方法引用-类::静态方法名

  1. // 类::静态方法名
  2. @Test
  3. public void methodStaticTest() {
  4. Comparator<Integer> comparator = (x, y) -> Integer.compare(x, y);
  5. Comparator<Integer> integerComparator = Integer::compare;
  6. }

image.png

③类实例方法引用-类::实例方法名

若Lambda参数列表中的第一参数是实例方法的调用者,而第二个参数是实例方法的参数时,可以使用类名::方法名

  1. // 类::实例方法名
  2. @Test
  3. public void Test() {
  4. BiPredicate<String, String> biPredicate = (x, y) -> x.equals(y);
  5. // 实例方法的第一个参数作为调用者,第二个参数作为调用者的参数,就可以使用类::实例方法名进行调用
  6. BiPredicate<String, String> stringBiPredicate = String::equals;
  7. }

二、构造器引用

语法格式:ClassName::new;

需要调用的构造器的参数列表与函数式接口中抽象方法的参数列表保持一致。

  1. // 构造器引用
  2. @Test
  3. public void constructTest() {
  4. Supplier<Employee> supplier = () -> new Employee();
  5. Supplier<Employee> employeeSupplier = Employee::new;
  6. System.out.println(employeeSupplier.get());
  7. Function<String, Employee> function = (x) -> new Employee(x);
  8. Function<String, Employee> employeeStringFunction = Employee::new;
  9. System.out.println(employeeStringFunction.apply("Fcant"));
  10. }

Employee.java添加新的构造器

  1. public Employee(String name) {
  2. this.name = name;
  3. }

三、数组引用

语法格式:Type[]::new

  1. // 数组引用
  2. @Test
  3. public void typeTest() {
  4. Function<Integer, String[]> function = (x) -> new String[x];
  5. String[] strings = function.apply(10);
  6. System.out.println(strings.length);
  7. Function<Integer, String[]> integerFunction = String[]::new;
  8. String[] s = integerFunction.apply(20);
  9. System.out.println(s.length);
  10. }
以太坊cppgolang区别 编程

以太坊cppgolang区别

以太坊是一种去中心化的开源平台,它采用智能合约技术,旨在构建和运行不受干扰的分布式应用程序。作为目前最受欢迎的区块链平台之一,以太坊提供了多种编程语言的支持,其
progolang 编程

progolang

Go语言(Golang)是由Google开发的一门静态类型编程语言。作为一名专业的Golang开发者,我深知这门语言的优势和特点。在本文中,我将介绍Golang
golangn个发送者 编程

golangn个发送者

Golang是一种开源的编程语言,由Google团队开发,旨在提高程序的并发性和简化软件开发过程。在Go语言中,有时需要向多个接收者发送信息。本文将介绍如何在G
golang技能图谱 编程

golang技能图谱

从互联网行业的快速发展到人工智能技术的日益成熟,各种编程语言也应运而生。而在这众多的编程语言中,Golang(即Go)作为一门强大且高效的开发语言备受关注。Go
评论:0   参与:  6