最近一直在做一个项目的前端,使用的框架是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