Lambda表达式基础知识
Lambda表达式是JAVA1.8之后引入的一个新的概念,对于Lambda表达式,有两个结构十分关键,一个是Lambda表达式本身,还有一个是函数式接口。
Lambda表达式不能单独存在,本质上是一个匿名方法,提供了函数式接口的实现。函数式接口是只有一个抽象方法的接口。
Lambda表达式引入了一个新的语法符号-> 符号左边是Lambda表达式参数列表,右边是Lambda表达式体,Lambda表达式体有两种形式,一种是只有一条语句的,另外是包含多个语句,需要用大括号括起来,对于第一种形式,如果Lambda生成的匿名方法有返回值,不用显示指定return语句,第二种需要显示指定return。下面是lambda的一个简单示例:
(n) -> n%2==0
//作用类似于如下方法
boolean isDoubleNumber(int n){
return n%2==0
}
函数式接口是只有一个抽象方法的接口,JAVA接口中默认方法都是抽象的,在JAVA1.8之前这种说法是正确的,但是在jdk1.8中,已经允许接口有自己默认实现的方法。如下所示是一个函数式接口示例
interface MyNumber{
double getValue();
}
前面介绍过,Lambda不能单独存在,lambda表达式是函数式接口的实现方法。我们怎么利用函数式接口来写一个lambda表达式呢?
MyNumber myn;
myn = ()->return 1234.0
//调用lambda表达式
System.out.println(myn.getValue())
Lambda表达式出现在函数式接口的上下文中,参数类型以及返回类型必须与函数式接口相兼容,比如函数式接口定义了两个int类型的参数,那lambda也必须定义两个int类型的参数(要么显示指定int,要么根据上下文可以推断出是int类型)。
Lambda表达式示例
不带参数的Lambda表达式
public interface MyNumber{
double myValue();
}
public static void main(String[] args) {
MyNumber myNumber;
myNumber = ()-> 123.45;
System.out.println(myNumber.myValue());
}
带参数的Lambda表达式
public interface MyNumberTest2 {
boolean test(int n);
}
public static void main(String[] args) {
MyNumberTest2 myNumberTest2;
myNumberTest2 = (n)-> n%2==0;
System.out.println(myNumberTest2.test(4));
}
以上两个Lambda示例,lambda体只有一个语句,下面我们来演示一下Lambda块表达式
public interface NumberFunction {
int func(int n);
}
public static void main(String[] args) {
NumberFunction myNumberFunction =(int n)->{
int result=1;
for (int i=1;i<=n;i++) {
result=result*i;
}
return result;
};
System.out.println(myNumberFunction.func(5));
}
下篇我们将介绍泛型函数式接口、作为参数传递Lambda表达式、Lambda表达式与异常