一个很重要的一点是:C/C++语言是有函数指针的,函数指针可以作为一个参数传给一个方法,而java是没有这个特性的。为了解决这个问题,Lambda表达式就出来了!Lambda表达式的核心就是函数式接口。
什么是函数式接口?
一个接口中只定义了一个抽象函数,称为函数式接口。
为什么需要函数式接口?
我们知道,java中方法是不能作为参数传给另一个方法的。方法的调用是需要引用载体的(类、对象或者接口),但为了执行一个方法就去新建一个类或者对象,是很繁琐的。于是,接口就理所应当承担这个“函数指针”的任务了!
为什么Lambda表达式是长这样的?()->{}
当一个接口中只有一个函数的时候,当用到这个接口时,我们都不需要关心方法名是什么,我们关心的是参数和函数体。于是(参数)->{函数体}的样子就出来了,并起了个名字为Lambda表达式。
有了Lambda表达式以后,我们就可以大胆的做下面这件事:
//是否是奇数
boolean flag = isOddNumber((a, b) -> {
System.out.println(a + b);
return a + b;
});
表面上isOddNumber()方法的参数是一个接口,实际上我们以一种优美的方式传了一段代码给isOddNumber方法。因为函数式接口可以隐式转为Lambda表达式。我们根本不需要知道Calculation这个接口有个sum函数,因为sum函数体就在我们眼前!
下面是对应的接口和函数:
public interface Calculation {
int sum(int a, int b);
}
private static boolean isOddNumber(Calculation c) {
Random random = new Random();
int a = random.nextInt(), b = random.nextInt();
return c.sum(a, b) % 2 != 0;
}
其实,没有Lambda表达式,也是可以实现这样的功能,但是不优美,函数体不明显,多了一些无用的信息。
boolean flag = isOddNumber(new Calculation() {
@Override
public int sum(int a, int b) {
System.out.println(a+b);
return a+b;
}
});
所以说,为什么Lambda表达式这么重要,因为java是一门优美的语言,而Lambda表达式让java显示出了这种优美!