javaSE8新特性-方法引用

可以说,方法引用就是 Lambda 表达式、函数式接口的一个实例,通过方法的名字来指向一个方法,可以认为是 Lambda 表达式的一个语法糖。

1. 方法引用

1.1. 格式

  • 使用方法引用操作符 ::将类或对象与方法名分割开来。
  • 如下四种主要使用情况:
    • 对象:: 实例方法名
    • 类 :: 静态方法名
    • 类 :: 实例方法名
    • 类 :: new

1.2. 使用要求

  1. Lambda 体只有一条语句,并且是通过调用一个对象的现有方法来完成的。
  2. 针对上面前三种使用情况:
    1. 情况一:函数式接口中的抽象方法 a 在被重写是使用了某一对象的方法 b。如果方法 a 的形参列表、返回值类型与方法 b 的形参列表、返回值类型都相同,则我们可以使用方法 b 实现对方法 a 的重写、替换。
    2. 情况二:函数式接口中的抽象方法 a 在被重写时使用了某个类的静态方法 b。如果方法 a 的形参列表、返回值类型与方法 b 的形参列表、返回值类型相同,则我们可以使用方法 b 实现对方法 a 的重写、替换。
    3. 情况三:函数式接口中的抽象方法a在被重写时使用了某一个对象的方法b。如果方法a的返回值类型与方法b的返回值类型相同,同时方法a的形参列表中有n个参数,方法b的形参列表有n-1个参数,且方法a的第1个参数作为方法b的调用者,且方法a的后n-1参数与方法b的n-1参数匹配(类型相同或满足多态场景也可以)

1.3. 使用实例

首先构造一个MethodReferenceExample 类作为辅助,结构如下:

public class MethodReferenceExample {
    // 静态方法
    public static int add(int a, int b) {
        return a + b;
    }

    // 实例方法
    public void print(String message) {
        System.out.println(message);
    }

    // 主方法
    public static void main(String[] args) {
        // 示例代码
    }
}
  1. 静态方法引用
import java.util.function.BiFunction;

public class MethodReferenceExample {
    public static int add(int a, int b) {
        return a + b;
    }

    public static void main(String[] args) {
        BiFunction<Integer, Integer, Integer> adder = MethodReferenceExample::add;
        System.out.println(adder.apply(10, 20)); // 输出 30
    }
}

BiFunction<T,U,R>: 抽象方法为 R apply(T t, U u),作用是接收一个 T 类型和一个 U 类型对象,返回一个 R 类型对象结果。

而MethodReferenceExample 类的 add 方法正是接收两个参数并返回一个结果,数据类型也刚好对得上。

  1. 实例方法引用
import java.util.function.Consumer;

public class MethodReferenceExample {
    public void print(String message) {
        System.out.println(message);
    }

    public static void main(String[] args) {
        MethodReferenceExample example = new MethodReferenceExample();
        Consumer<String> printer = example::print;
        printer.accept("Hello, World!"); // 输出 Hello, World!
    }
}

Consumer<T> : 抽象方法为 void accept(T t),作用是接收一个参数并进行一定的操作但是不返回值。

exmaple::print 则为 printer 提供了操作方式,即当实行 printer.accept(t)时会执行 example.print(t);

  1. 类的实例方法引用
import java.util.function.Function;

public class MethodReferenceExample {
    public static void main(String[] args) {
        Function<String, Integer> stringToInt = Integer::valueOf;
        System.out.println(stringToInt.apply("123")); // 输出 123
    }
}

Function<T , R> : 抽象方法为 R apply(T t),作用是接收一个参数 t,进行一定处理后返回类型为 R 的值。

  1. 构造方法引用
import java.util.function.Function;

public class MethodReferenceExample {
    public static void main(String[] args) {
        Function<String, Integer> stringToInt = Integer::new;
        System.out.println(stringToInt.apply("456")); // 输出 456
    }
}

2. 数组构造引用

格式: 数组类型名::new

eg:

@Test
public void test(){
    Function<Integer,String[]> func1 = length -> new String[length];
    String[] arr1 = func1.apply(5);
    System.out.println(Arrays.toString(arr1));

    System.out.println("*******************");

    Function<Integer,String[]> func2 = String[] :: new;
    String[] arr2 = func2.apply(10);
    System.out.println(Arrays.toString(arr2));

}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值