Java8方法引用

本文详细介绍了Java8中的方法引用,从方法引用出现的背景出发,通过5种语法展示了如何使用方法引用,强调了方法引用能简化Lambda表达式,并提供了使用方法引用的总结,指出方法引用是Lambda的孪生兄弟,能够更简洁地复用已有方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内容简介:

  • 方法引用Demo详解
  • 通过5种语法使用方法引用
  • 方法引用使用总结


1. 在Java8中方法引用Demo详解 
1.1 方法引用出现的背景 
在使用Lambda表达式的时候,我们实际上传递进去的代码就是一种解决方案:拿什么参数做什么操作。那么考虑一种情况:如果我们在Lambda中所指定的操作方案,已经有地方存在相同方案,那是否还有必要再写重复逻辑呢?
1.2 问题的引出

1.3 问题的发现与解决 
这段代码的问题在于,对String进行控制台打印输出的操作方案,明明已经有了现成的实现,那就是System.out对象中的println(String)方法。既然Lambda希望做的事情就是调用println(String)方法,那何必自己手动调用呢? 
能否省去Lambda的语法格式(尽管它已经相当简洁)呢?只要“路由”过去就好了:

1.4 方法引用案例的总结 
以上例中,System.out对象中有一个重载的println(String)方法恰好就是我们所需要的。那么对于printString方法的函数式接口参数,对比下面两种写法:
Lambda表达式:s -> System.out.println(s); 
方法引用:System.out::println 
第一种语义是指:拿到参数之后经Lambda之手,继而传递给System.out.println方法去处理。第二种等效写法的语义是指:直接让System.out中的println方法来取代Lambda。两种写法的执行效果完全一样,而第二种方法引用的写法复用了已有方案,更加简洁。
1.5 引用运算符双冒号“::”为引用运算符,而它所在的表达式被称为方法引用。如果Lambda要表达的函数方案已经存在于某个方法的实现中,那么则可以通过双冒号来引用该方法作为Lambda的替代者。
2.通过5种语法使用方法引用 
2.1 通过对象名引用成员方法

2.2 通过类名引用静态方法

2.3 通过类名引用成员方法



2.4 通过super引用成员方法


2.5通过this引用成员方法


3.方法引用使用总结
(1) Lambda表达式:s -> System.out.println(s); 
(2) 方法引用:System.out::println 
第一种语义是指:拿到参数之后经Lambda之手,继而传递给System.out.println方法去处理。 
第二种等效写法的语义是指:直接让System.out中的println方法来取代Lambda。 
两种写法的执行效果完全一样,而第二种方法引用的写法复用了已有方案,更加简洁。函数式接口是Lambda的基础,而方法引用是Lambda的孪生兄弟。

Java 8 引入了方法引用(Method Reference),它是 Lambda 表达式的一种简化形式。通过方法引用,我们可以直接引用已有的类或实例方法,而无需再显式地书写完整的 lambda 表达式。 ### 方法引用的基本语法 方法引用主要有以下四种形式: #### 1. **静态方法引用** 格式为 `类名::静态方法`。 - 示例: ```java Arrays.sort(array, String::compareToIgnoreCase); ``` #### 2. **特定对象的实例方法引用** 如果某个对象已经存在,并需要引用它的方法,则可以使用 `对象::实例方法` 的格式。 - 示例: ```java Consumer<String> consumer = System.out::println; consumer.accept("Hello World"); ``` #### 3. **任意类型实例方法引用** 当我们需要对某类型的任意对象应用其实例方法时,可以用这种模式——即 `类型::实例方法` 形式。 - 示例: ```java Function<String, Integer> function = Integer::parseInt; // 将String转成Integer int num = function.apply("123"); // 结果为123 ``` #### 4. **构造函数引用** 可用于创建新对象的场景中,其格式类似于其他方法引用的形式 `Class::new`。 - 示例: ```java Supplier<Date> supplier = Date::new; // 创建一个新的Date对象 Date date = supplier.get(); ``` ### 使用场景及优点 - 简化代码:当lambda表达式的主体仅是对现有方法的一次简单调用时,可以直接改用更简洁的方法引用表示法; - 提高可读性:对于熟悉的标准库功能来说,使用名字代替匿名内部类会使得意图更加清晰直观; 总之,在适当的地方利用好方法引用可以使程序变得既紧凑又易于理解!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值