23.方法的引用和Function接口

23.方法的引用和Function接口


23.1 知识点

什么是方法的引用

使用函数式接口去装载我们在类中声明的方法,而不是lambda表达式。

如何进行方法的引用

声明一些函数型接口

import java.util.function.Function;

interface ITest01
{
    void fun();
}

interface ITest02
{
    Lesson23_方法的引用和Function接口 fun();
}

interface ITest03
{
    Lesson23_方法的引用和Function接口 fun(int a);
}

interface ITest04
{
    Integer[] fun(int n);
}

interface ITest05<T>
{
    void fun(T i);
}

声明一些方法

public class Lesson23_方法的引用和Function接口
{

    public Lesson23_方法的引用和Function接口()
    {
        System.out.println("无参构造");
    }

    public Lesson23_方法的引用和Function接口(int i)
    {
        System.out.println("有参构造" + i);
    }

    public static void Test()
    {
        System.out.println("方法调用");
    }

    public void Test2()
    {
        System.out.println("方法调用2");
    }

    //泛型方法
    static public <T> void Test3(T i)
    {
        System.out.println(i);
    }
}

1. 引用静态方法

// 类名::静态方法名
ITest01 t = Lesson23_方法的引用和Function接口::Test;
t.fun();// 方法调用

2. 引用成员方法

// 对象名::成员方法名
Lesson23_方法的引用和Function接口 l = new Lesson23_方法的引用和Function接口();// 无参构造
ITest01 t2 = l::Test2;
t2.fun();// 方法调用2

3. 引用构造函数

3-1. 无参和有参构造 类名::new
ITest02 tt = Lesson23_方法的引用和Function接口::new;
Lesson23_方法的引用和Function接口 l2 = tt.fun();// 无参构造

ITest03 tt2 = Lesson23_方法的引用和Function接口::new;
l2 = tt2.fun(99);// 有参构造99
3-2. 数组构造 类名[]::new
ITest04 tt4 = Integer[]::new;
Integer[] arr = tt4.fun(9);
System.out.println(arr.length);// 9

4. 引用泛型方法

// 函数式接口的泛型和对应的泛型方法 参数或返回值上一定要对应
ITest05<Integer> ttt = Lesson23_方法的引用和Function接口::Test3;
ttt.fun(999);// 999

Function接口

在java.util.function包中提供了预先定义好的函数式接口供使用,其中最常用的接口是 Function<T,R>接口。

调用方法:apply

Function<Integer, String> function = (a) ->
{
    a += 99;
    return a.toString();
};
System.out.println(function.apply(1));// 100

注意:更多的写好的函数式接口可以直接去function包中查看。如果不想记忆,那直接自己写函数式接口即可。

总结

不管是使用lambda表达式还是想要引用方法,都需要使用函数式接口来装载。除了Function以外Java中还写好了很多函数式接口供使用。用现成的还是自己写,自己决定即可。


23.2 知识点代码

import java.util.function.Function;

interface ITest01
{
    void fun();
}

interface ITest02
{
    Lesson23_方法的引用和Function接口 fun();
}

interface ITest03
{
    Lesson23_方法的引用和Function接口 fun(int a);
}

interface ITest04
{
    Integer[] fun(int n);
}

interface ITest05<T>
{
    void fun(T i);
}

public class Lesson23_方法的引用和Function接口
{

    public Lesson23_方法的引用和Function接口()
    {
        System.out.println("无参构造");
    }

    public Lesson23_方法的引用和Function接口(int i)
    {
        System.out.println("有参构造" + i);
    }

    public static void Test()
    {
        System.out.println("方法调用");
    }

    public void Test2()
    {
        System.out.println("方法调用2");
    }

    //泛型方法
    static public <T> void Test3(T i)
    {
        System.out.println(i);
    }

    public static void main(String[] args)
    {
        //知识点1:什么是方法的引用
        //使用函数式接口去装载我们在类中声明的方法
        //而不是lambda表达式

        //知识点2:如何进行方法的引用
        //1.引用静态方法
        // 类名::静态方法名
        ITest01 t = Lesson23_方法的引用和Function接口::Test;
        t.fun();//方法调用

        //2.引用成员方法
        // 对象名::成员方法名
        Lesson23_方法的引用和Function接口 l = new Lesson23_方法的引用和Function接口();//无参构造
        ITest01 t2 = l::Test2;
        t2.fun();//方法调用2

        //3.引用构造函数
        // 3-1.无参和有参构造 类名::new
        ITest02 tt = Lesson23_方法的引用和Function接口::new;
        Lesson23_方法的引用和Function接口 l2 = tt.fun();//无参构造

        ITest03 tt2 = Lesson23_方法的引用和Function接口::new;
        l2 = tt2.fun(99);//有参构造99

        // 3-2.数组构造 类名[]::new
        ITest04 tt4 = Integer[]::new;
        Integer[] arr = tt4.fun(9);
        System.out.println(arr.length);//9

        //4.引用泛型方法
        //函数式接口的泛型和对应的泛型方法 参数或返回值上一定要对应
        ITest05<Integer> ttt = Lesson23_方法的引用和Function接口::Test3;
        ttt.fun(999);//999



        //知识点3:Function接口
        //我们再使用lambda表达式时都需要自己声明函数式接口用于装载
        //为了方便我们的使用,Java在java.util.function包中提供了预先定义好的函数式接口供我们使用
        //其中最常用的接口是 Function<T,R>接口
        //T:参数类型
        //R:返回值类型
        //调用方法:apply
        Function<Integer, String> function = (a) ->
        {
            a += 99;
            return a.toString();
        };
        System.out.println(function.apply(1));//100

        //注意:更多的写好的函数式接口 可以直接去function包中查看
        //如果不想记忆,那直接自己写函数式接口即可




        //总结
        //不管是使用lambda表达式还是想要引用方法
        //我们都需要使用函数式接口来装载
        //除了Function以外Java中还写好了很多函数式接口供我们使用
        //用现成的还是自己写,自己决定即可
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏