学习任务:

视频学习

方法引用的几种形式

静态方法引用测试

测试抽象方法为void的情况

根据方法应用形式不同可分为如下几个形式:

image-20210705082439950

每一种方法引用的形式对应相同的Lambda表达式,下边分别进行测试。

静态方法引用即引用类的静态方法,比如:Integer::sum表示了引用Integer类的sum方法,测试代码如下:

首先明确函数式接口,本例子求两个数的和,使用BiFunction函数接口来完成,如下:

@FunctionalInterface
public interface BiFunction<T, U, R> {

    /**
     * Applies this function to the given arguments.
     *
     * @param t the first function argument
     * @param u the second function argument
     * @return the function result
     */
    R apply(T t, U u);
    ...

测试如下:

package com.pbteach.javase.oop.lambda.test3;

import java.util.function.BiFunction;

/**
 * 静态方法引用测试
 * @author 攀博课堂(www.pbteach.com)
 * @version 1.0
 **/
public class TestStaticFun {

    public static void main(String[] args) {
        //两个数的和
        System.out.println(operate(Integer::sum,1,2));
        //求最大数
        System.out.println(operate(Integer::max,1,2));
    }

    /**
     * 两个数的操作
     * @param fun 操作方法
     * @param n1 第一个数
     * @param n2 第二个数
     * @return 结果
     */
    public static int operate(BiFunction<Integer,Integer,Integer> fun,int n1,int n2){
        return fun.apply(n1,n2);
    }
}

上边的代码中Integer::sum和Integer::max作用相同,它们和BiFunction接口的抽象方法匹配即有两个参数及返回值。

根据前边的学习可知方法引用的参数和返回值要和函数式接口匹配,但是有一种特殊情况也需要大家知道,如果函数式接口的抽象方法的返回值为void时,所引用的方法不管是否有返回值都可以和抽象方法匹配,下边测试抽象方法返回值为void但是方法引用有返回值的情况。

比如Consumer接口,如下:

package java.util.function;

import java.util.Objects;
@FunctionalInterface
public interface Consumer<T> {

	void accept(T t);
	
    default Consumer<T> andThen(Consumer<? super T> after) {
        Objects.requireNonNull(after);
        return (T t) -> { accept(t); after.accept(t); };
    }
}

Consumer接口的accept方法有一个参数,没有返回值,下边使用方法引用测试:

定义一个静态方法

    package com.pbteach.javase.oop.lambda.test3;

	import java.util.function.BiFunction;
	import java.util.function.Consumer;

    public class TestStaticFun {
    
    /**
     * 自定义静态方法,转大写
     * @param num 输入一个参数
     * @return 转大写的字符串
     */
    public static String toUpperCase(String s){
        System.out.println("s="+s);
        return s.toUpperCase();
    }
    ....

本方法有一个参数和返回值,本静态方法的引用仍然可以赋值给Consumer接口,测试如下:

public class TestStaticFun {

    public static void main(String[] args) {
		 ...
        //测试toUpperCase
        Consumer<String> fun = TestStaticFun::toUpperCase;
        fun.accept("www.pbteach.com");
    }
    ...

输出:

s=www.pbteach.com

从输出结果可以看出toUpperCase方法正常执行。

提问-攀博课堂
我要提问 不会就问,有效沟通
关注公众号,加入微信群交流提问。 攀博课堂官方公众号
问答列表,查看本知识点所有问题