Java8方法引用

本文介绍了Java 8中的方法引用特性,包括构造器引用、静态方法引用、特定类的任意对象方法引用和特定对象方法引用。方法引用使得代码更加简洁,能够替代部分lambda表达式。示例代码展示了如何在不同场景下使用方法引用。

1.方法引用的特性

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

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

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


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 );

方法引用是可以替换lambda表达式中的一些语句的

 

### 方法引用的定义 Java 8 引入了方法引用,它是一种更简洁的 Lambda 表达式,用于直接引用已有的方法方法引用可以使代码更简洁易读,尤其在使用函数式接口时,避免了 Lambda 表达式中重复的方法调用代码。 ### 方法引用的类型 #### 静态方法引用 语法:`类名::静态方法名`。用于引用类的静态方法。 ```java import java.util.Arrays; import java.util.List; class MathUtils { static int square(int num) { return num * num; } } public class StaticMethodReferenceExample { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); numbers.stream() .map(MathUtils::square) .forEach(System.out::println); } } ``` 这里 `MathUtils::square` 是静态方法引用引用了 `MathUtils` 类的 `square` 静态方法。 #### 实例方法引用 语法:`实例对象::实例方法名`。用于引用某个对象的实例方法。 ```java import java.util.Arrays; import java.util.List; class StringUtils { boolean isUpperCase(String str) { return str.equals(str.toUpperCase()); } } public class InstanceMethodReferenceExample { public static void main(String[] args) { StringUtils utils = new StringUtils(); List<String> words = Arrays.asList("HELLO", "world", "JAVA"); words.stream() .filter(utils::isUpperCase) .forEach(System.out::println); } } ``` `utils::isUpperCase` 是实例方法引用引用了 `utils` 对象的 `isUpperCase` 方法。 #### 特定类型的任意对象的实例方法引用 语法:`类名::实例方法名`。当 Lambda 表达式的第一个参数是实例方法的调用者,并且其余参数是实例方法的参数时使用。 ```java import java.util.Arrays; import java.util.List; public class ArbitraryObjectInstanceMethodReferenceExample { public static void main(String[] args) { List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); names.stream() .sorted(String::compareToIgnoreCase) .forEach(System.out::println); } } ``` `String::compareToIgnoreCase` 属于这种类型的方法引用。 #### 构造方法引用 语法:`类名::new`。用于引用类的构造方法。 ```java import java.util.ArrayList; import java.util.List; import java.util.function.Supplier; class Person { String name; Person(String name) { this.name = name; } } public class ConstructorMethodReferenceExample { public static void main(String[] args) { Supplier<List<Person>> listSupplier = ArrayList::new; List<Person> personList = listSupplier.get(); personList.add(new Person("John")); System.out.println(personList.size()); } } ``` `ArrayList::new` 是构造方法引用,用于创建 `ArrayList` 对象。 ### 方法引用的使用场景 方法引用常用于函数式接口的实现,如 `Predicate`、`Function`、`Consumer` 等。在使用 Java Stream API 时,方法引用可以使代码更加简洁,提高代码的可读性和可维护性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值