lambda表达式及其应用
一.简介
lambda表达式实质上是一个没有方法名的匿名方法。
例如:
int fun1(int x, int y){
return x*y+10;
}
用lambda表达式可以表示为:
(int x, int y) -> x*y+10;
作用
- 使得代码变得异常简洁
- 避免匿名内部类定义过多
- 去掉了一堆没有意义的代码,只留下核心的逻辑
表达格式
lambda表达式通常以“(argument)->(body)
”这样的格式书写,其中“->
”被称为lambda运算符或箭头运算符,具体有两种形式:
- (arg1, arg2,…) -> {body} //省略参数类型
- (Type1 arg1, Type2 arg2…) -> {body}//指定参数类型
在表达式中,参数可以是零个或者多个;参数的类型可以指定也可以省略,若参数类型省略,Java编译器会根据表达式的上下文推导出参数的类型。
二.应用
lambda表达式不是独立执行的,而是经常被应用在函数式的接口定义的抽象方法实现中。
下面先简单介绍什么叫函数式接口:
1.函数式接口
函数式接口是只包含一个抽象方法的接口,又被称为单例抽象类接口。
例:
public interface Runnable{
void run();
}
该接口中只包含了一个抽象方法run(),故为一个典型的函数式接口。
例:用传统方法来表达接口的实现:
interface myInter{ //函数接口
double compute(double x, double y); //唯一的抽象方法
}
class myInple1 implements myInter{
public double compute(double x,double y){//抽象方法的第1种实现
return x+y;
}
}
class myInple2 implements myInter{
public double compute(double x,double y){//抽象方法的第2种实现
return x-y;
}
}
class myInple3 implements myInter{
public double compute(double x,double y){//抽象方法的第3种实现
return x*y;
}
}
class myInple4 implements myInter{
public double compute(double x,double y){//抽象方法的第4种实现
return x/y;
}
}
public class nolambdaTest {
public static void main(String[] args){
myInple1 add = new myInple1();
System.out.println("90.0和5.0两个数求和,结果为:"+add.compute(90.0,5.0));
myInple2 sub = new myInple2();
System.out.println("90.0和5.0两个数求差,结果为:"+sub.compute(90.0,5.0));
myInple3 mul = new myInple3();
System.out.println("90.0和5.0两个数求积,结果为:"+mul.compute(90.0,5.0));
myInple4 div = new myInple4();
System.out.println("90.0和5.0两个数求商,结果为:"+div.compute(90.0,5.0));
}
}
改用lambda表达式来实现:
interface myInter{ //函数接口
double compute(double x, double y); //唯一的抽象方法
}
public class lambdaTest1 {
public static void main(String[] args){
myInter add = (m,n) -> m+n;
System.out.println("90.0和5.0两个数求和,结果为:"+add.compute(90.0,5.0));
myInter sub = (m,n) -> m-n;
System.out.println("90.0和5.0两个数求差,结果为:"+sub.compute(90.0,5.0));
myInter mul = (m,n) -> m*n;
System.out.println("90.0和5.0两个数求积,结果为:"+mul.compute(90.0,5.0));
myInter div = (m,n) -> m/n;
System.out.println("90.0和5.0两个数求商,结果为:"+div.compute(90.0,5.0));
}
}
这样写会比较简洁,而且也易于理解。
- 注意:使用lambda表达式时,函数式接口所定义的抽象方法的类型必须与lambda表达式的类型兼容,如果不兼容,就会导致编译出错。