当前位置: 首页 > news >正文

【Java 8】方法引用

方法引用是 Java 8 中引入的一种简洁语法,可以用来代替某些特定的 Lambda 表达式。简单来说,方法引用是直接使用已有的方法来实现功能,而不必显式地写出方法的具体实现过程。

方法引用使用::符号来表示。


在 Java中,方法引用主要分为四种类型:

        • 1. 静态方法引用
          • 示例
        • 2. 实例方法引用
          • 示例
        • 3. 特定类型的任意对象的方法引用
          • 示例
        • 4. 构造器引用
          • 示例


举个简单的例子——假设我们有一组姓名待打印。可以使用 Lambda 表达式或方法引用来实现:

  • 使用Lambda表达式:

    names.forEach(name -> System.out.println(name));
    

    这里的name -> System.out.println(name)就是一个简单的Lambda表达式,它的功能是接收每个名字,然后打印它。

  • 使用方法引用:

    names.forEach(System.out::println);
    

    这里System.out::println就是方法引用,直接指向了println方法的功能。这比前面的Lambda表达式更简洁直观。


1. 静态方法引用

静态方法引用的格式是:ClassName::staticMethodName,用来引用某个类的静态方法。

示例

Math类里面有一个静态方法abs(),用于求一个整数的绝对值。

import java.util.function.Function;public class StaticMethodExample {public static void main(String[] args) {// 使用 Lambda 表达式Function<Integer, Integer> lambdaAbs = (x) -> Math.abs(x);// 使用静态方法引用Function<Integer, Integer> methodRefAbs = Math::abs;System.out.println(lambdaAbs.apply(-10));  // 输出 10System.out.println(methodRefAbs.apply(-20));  // 输出 20}
}

在这里,Math::abs是对Math.abs静态方法的引用,它的作用是接收一个整数并返回它的绝对值。


2. 实例方法引用

实例方法引用的格式是:instance::methodName,用来引用某个对象的实例方法。

示例

想要得到一个字符串的长度:

import java.util.function.Supplier;public class InstanceMethodExample {public static void main(String[] args) {String message = "Hello, world!";// 使用 Lambda 表达式Supplier<Integer> lambdaLength = () -> message.length();// 使用实例方法引用Supplier<Integer> methodRefLength = message::length;System.out.println(lambdaLength.get());  // 输出 13System.out.println(methodRefLength.get());  // 输出 13}
}

在这个例子中,message::length引用了message字符串的length()方法,用来获取字符串的长度。


3. 特定类型的任意对象的方法引用

特定类型的任意对象的方法引用的格式是:ClassName::methodName,用于引用某个类的实例方法,但不指定具体的对象。它通常用于集合操作,适用于所有该类的对象。

示例

有一个包含若干字符串的列表,想要把每个字符串转换为大写字母。

import java.util.Arrays;
import java.util.List;public class ArbitraryObjectExample {public static void main(String[] args) {List<String> names = Arrays.asList("alice", "bob", "charlie");// 使用 Lambda 表达式names.forEach(name -> System.out.println(name.toUpperCase()));// 使用特定类型的任意对象的方法引用names.forEach(String::toUpperCase);}
}

在这个例子中,String::toUpperCase表示的是对于每个字符串都调用toUpperCase()方法。实际上,这里的方法引用就相当于对列表中的每个字符串进行统一的转换操作。


4. 构造器引用

构造器引用的格式是:ClassName::new,用于引用类的构造方法。这样我们可以通过工厂模式轻松地创建对象。

示例

我们有一个Person类,它有一个无参构造器。使用构造器引用来创建新的Person对象。

import java.util.function.Supplier;public class ConstructorReferenceExample {public static void main(String[] args) {// 使用 Lambda 表达式Supplier<Person> lambdaPerson = () -> new Person();// 使用构造器引用Supplier<Person> methodRefPerson = Person::new;Person p1 = lambdaPerson.get();Person p2 = methodRefPerson.get();System.out.println(p1);  // 输出 Person{name='Unknown'}System.out.println(p2);  // 输出 Person{name='Unknown'}}
}class Person {String name;public Person() {this.name = "Unknown";}@Overridepublic String toString() {return "Person{name='" + name + "'}";}
}

在这里,Person::new是对Person类构造器的引用,它的作用是创建一个新的Person对象。


http://www.mrgr.cn/news/65527.html

相关文章:

  • Aurora 64b/66bIP核学习
  • 市象独家|百度副总裁陈一凡轮岗MEG;美团开放两项员工专属优惠 美团
  • FreeRTOS | 信号量(第十四天)
  • three.js 智慧城市扫光效果
  • 【力扣热题100】[Java版] 刷题笔记-121. 买卖股票的最佳时机
  • ProLightsfx新的出发–从CSDN到WordPress
  • RT-Thread PIN设备 UART设备
  • 2023年SCRM系统排名分析及市场趋势解读
  • 7. 触发模式
  • C++中,如何找到一个vector中最大的元素
  • Spring Boot框架
  • 数字身份发展趋势前瞻:身份即服务
  • Matlab实现海马优化算法(SHO)求解路径规划问题
  • IA应用加速,让电子供应链更智能高效
  • 安当KSP密钥管理系统:引领未来,全面支持抗量子算法
  • 如何快速把多个视频文件生成一个二维码来印刷使用?
  • 【OH】openHarmony整仓代码下载
  • Day24 opencv预处理
  • 云原生周刊:微服务架构 2025 年的发展趋势丨2024.11.04
  • Qt项目实战:红绿灯小程序
  • 二分查找算法上篇
  • SQL server 列转行
  • 记录一次node节点异常的排查
  • Python下的卡尔曼和贝叶斯滤波器
  • 互联网十万个为什么之什么是DDoS攻击?
  • 【论文复现】ChatGPT多模态命名实体识别