Java中将函数作为参数进行传递

最近一直在做一个项目的前端,使用的框架是vue,还有一些基于vue的组件库,学习了很多js的相关内容。今天突然想看一下Java,发现好久不看忘记了许多,还是希望每天晚上可以写点博客,当做学习,复习的方式,也改变一下我拖拖拉拉的行事,希望可以坚持下去,加油,打工人!

Java中将函数作为参数进行传递

现在了解到的有两种:Java8之前,一个常见的模式是将它“包装”在一个界面中,例如Callable接口,然后传入一个Callable。Java8以及之后就是今天学到的一种方法,通过Java8的新特性lambda表达式

首先简单介绍一下Java lambda表达式

Java8之后,接口被进行了拓展,除了有一些object类中的方法(emmm怎么说呢,接口和object类的关系不是继承,有些暧昧,有可能是接口隐形的实现了object类中的方法,就是toString()等方法),还可包含默认方法和静态方法(仅可被接口自身调用,不可被继承),除此之外,均为不可有方法体的抽象方法,当接口有且仅有一个抽象方法时,lambda就可以登场了

现在有一个Greeting接口,我们想要直接实现并使用它的唯一一个抽象方法sayMessage(String message)而不想去创建一个对象并实现该接口(原谅我吧,本人菜鸡,还没做过真正的后端,想象不到一个合理的需求场景),原来的话,可能会这样写

package com.suibian.www.java;

public class LambdaDemo {
    public static void main(String[] args) {
        Greeting greeting = new Greeting() {
            @Override
            public void sayMessage(String message) {
                System.out.println("Hello" + message);
            }
        };
        greeting.sayMessage("World");
    }
}

@FunctionalInterface
interface Greeting {
    //唯一的抽象方法
    void sayMessage(String message);

    //默认方法
    default void defaultMethod(){
        System.out.println("默认方法");
    }
    //静态方法
    static void staticMethod(){
        System.out.println("静态方法");
    }
}

运行结果为:

HelloWorld

使用lambda之后

public class LambdaDemo {
    public static void main(String[] args) {
        Greeting greeting = (message) -> System.out.println("Hello" + message);
        greeting.sayMessage("World");
    }
}

运行结果为:

HelloWorld
很帅有没有,一下就变得高大上而且简单了许多(好吧我开玩笑的,但可读性确实提高了许多)

重点来了,有了上面的结果,也许你已经轻易地想到了为什么可以使用函数当做参数进行传递。 困了困了,直接上代码

package com.suibian.www.java;

public class LambdaDemo {
    public static void main(String[] args) {
        testLambda(() -> 180);
    }

    public static void testLambda(Flyable flyable) {
        System.out.println("飞行速度为" + flyable.getFlySpeed() + "m/s");
    }
}

interface Flyable {
    int getFlySpeed();
}

运行结果为:

飞行速度为180m/s
成功!testLambda()以实现了接口Flyable的对象为参数,所以我们只要通过lambda实现该接口的唯一一个抽象方法并直接当做参数传入就好,只不过将多步放在一步进行操作。

这是我的第二篇博客,也可能因为想说的比较多,表述能力又比较弱,而且很菜,所以啰啰嗦嗦的说了些没用的,希望大家不要介意,本文可能有很多错误的地方,毕竟很久没看Java了,被js自由的风格惯坏了(我差点忘了主函数怎么写,好几次写方法没加返回类型(js是动态类型语言),傻了傻了),希望有大佬看到帮忙指正,一定尽快改正。

你可能感兴趣的:(JavaLearn,java,lambda)