前言
在其他语言中,函数式编程是很常见的,java8中为了支持函数式编程,新增了lambada表达式。lambada表达式其实是匿名内部类和闭包的一种符号表示,至于概念性的问题,大家不必深究,lambada表达式会用就可以了。
1.为何需要lambada表达式
在js中,函数的参数是另一个函数,返回值也是一个函数的情况是根常见的,因此js也是一门典型的函数式语言。而在java8以前的版本中,我们是无法将函数作为参数传递给一个方法的,也无法声明返回值是一个函数的方法,但是这种需求是存在的,java中,匿名内部类实际上就是在一个方法的参数位置声明一个匿名的内部类,这种代码结构的核心代码就几句,但是结构代码却比较长,是比较冗余的,如果用lambada表达式来实现这这种代码结构,是非常简洁的,并且可读性也比较强,所以java8中提供了lambada表达式
2.如何使用lambada表达式
lamba表达式的符号表示为 ->,其基本结构形式为:(param1,param2,param3...)-> { }
如果只有一个参数,可以不加小括号,只有一行执行代码,也可以没有箭头后面的大括号,比如 i ->System.Out.Println(i);
如果没有参数 ,只需要一个小括号即可,比如:()-> System.Out.Println("hello");
下面代码示例:
public class LambadaExample {
public static void main(String[] args) {
//不使用lamba表达式
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("hello,I am lambada");
}
}).start();
//使用lambada表达式
new Thread(() -> System.out.println("hello,I am lambada")).start();
//lambada的执行代码有多行
new Thread( () -> {
try {
TimeUnit.SECONDS.sleep(5);
System.out.println("I am also lambada");
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
//有参数的lambada表达式
Consumer<Integer> consumer = (i) -> System.out.println(i);
consumer.accept(666);
}
}
总结
lambad表达式为java添加了缺失的函数式编程特性,在面向对象的语言中,使我们也能将函数当做一等公民看待。在函数作为一等公民的语言汇中,lambada表达式的类型是函数,比如python语言,但在java中,lambada表达式的类型依然是对象,他们必须依附于一些特别的对象类型--函数式接口,这也是Java的lambada表达式和其他函数式语言不同的地方。
网友评论