Java 8 方法引用

转自:https://www.runoob.com/java/java8-method-references.html

方法引用通过方法的名字来指向一个方法。

方法引用可以使语言的构造更紧凑简洁,减少冗余代码。

方法引用使用一对冒号 :: 。

下面,我们在 Car 类中定义了 4 个方法作为例子来区分 Java 中 4 种不同方法的引用。

package com.runoob.main; @FunctionalInterface public interface Supplier<T> { T get(); } class Car { //Supplier是jdk1.8的接口,这里和lamda一起使用了 public static Car create(final Supplier<Car> supplier) { return supplier.get(); } public static void collide(final Car car) { System.out.println("Collided " + car.toString()); } public void follow(final Car another) { System.out.println("Following the " + another.toString()); } public void repair() { System.out.println("Repaired " + this.toString()); } }
  • 构造器引用:它的语法是Class::new,或者更一般的Class< T >::new实例如下:

    final Car car = Car.create( Car::new ); final List< Car > cars = Arrays.asList( car );
  • 静态方法引用:它的语法是Class::static_method,实例如下:

    cars.forEach( Car::collide );
  • 特定类的任意对象的方法引用:它的语法是Class::method实例如下:

    cars.forEach( Car::repair );
  • 特定对象的方法引用:它的语法是instance::method实例如下:

    final Car police = Car.create( Car::new ); cars.forEach( police::follow );

方法引用实例

在 Java8Tester.java 文件输入以下代码:

Java8Tester.java 文件

import java.util.List; import java.util.ArrayList; public class Java8Tester { public static void main(String args[]){ List names = new ArrayList(); names.add("Google"); names.add("Runoob"); names.add("Taobao"); names.add("Baidu"); names.add("Sina"); names.forEach(System.out::println); } }

实例中我们将 System.out::println 方法作为静态方法来引用。

执行以上脚本,输出结果为:

$ javac Java8Tester.java 
$ java Java8Tester
Google
Runoob
Taobao
Baidu
Sina

转载于:https://www.cnblogs.com/sharpest/p/10787720.html

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、付费专栏及课程。

余额充值