Lambda表达式(Lambda Expressions)
什么是Lambda表达式
Lambda Expressions enable you to encapsulate a single unit of behavior and pass it to other code. ——[官网原文]
lambda表达式可以把代码中的某一个行为包装起来,并把这个包装好的行为传给其他代码。
不懂?不要着急,请接着往下看↓
Lambda表达式的作用
One issue with anonymous classes is that if the implementation of your anonymous class is very simple, such as an interface that contains only one method, then the syntax of anonymous classes may seem unwieldy and unclear.——[官网原文(节选)]
使用匿名类时,会碰到这样的问题——如果这个匿名类是一个很简单的类,比如:其中只包括一个接口,接口里只有一个方法,那么这个匿名类用起来时的语法会看起来很不直观,很不清晰。Lambda表达式可以解决这个问题。
- 使代码更加简洁,比起较为简单匿名类来说,含义更清晰易懂
先来个例子感受一下:
//首先,定义一个接口,叫IHelloLambda,里面只有一个方法,叫print
public interface IHelloLambda {
void print(String s);
}
//现在用匿名类的方法来使用它
public static void main(String[] args) {
IHelloLambda Anonymous = new IHelloLambda() { //使用匿名类实现了print接口
@Override
public void print(String s) {
System.out.println("hello" + s);
}
};
Anonymous.print("anonymous"); //调用print方法
}
//现在用lambda表达式来使用它
public static void main(String[] args) {
IHelloLambda lambda = (a)->System.out.println("hello" + a);//lambda表达式完成匿名类的行为
lambda.print("lambda"); //调用print方法
}
是不是代码更加简洁,清晰了?
Lambda表达式语法
参考官网lambda表达式语法
lambda表达式包含以下几个元素:
- 以逗号分隔的方法入参,可以省略入参的类型声明,如果入参有多个,要打上括号,如果入参只有一个,可以省略括号。
- 一个箭头符号”->”
- 代码主体,包含了一个表达式或者代码块。可以用大括号括起来。
比如上文中的例子:
(a)->System.out.println("hello" + a);
可以写成
a->{ //省略括号
System.out.println("hello" + a); //用大括号把代码块包起来
}
这几条规则总结起来就是如下例子:
public class Calculator { //计算器类
interface IntegerMath { //整数算术接口,里面有一个方法,叫"操作",包含2个整型入参,a和b
int operation(int a, int b);
}
public int operateBinary(int a, int b, IntegerMath op) { //两个数的操作,入参为整型a,b,和接口对象op
return op.operation(a, b); //返回整型op调用operation后的结果
}
public static void main(String... args) {
Calculator myApp = new Calculator();
IntegerMath addition = (a, b) -> a + b; //接口addition(加法),lambda表达式实现接口,入参a,b,返回a+b的值
IntegerMath subtraction = (a, b) -> a - b; //接口subtraction(减法),入参a,b,返回a-b的值
System.out.println("40 + 2 = " + //打印40+2的结果,调用operateBinary,输入为a,b和接口addition
myApp.operateBinary(40, 2, addition));
System.out.println("20 - 10 = " + //打印20-10的结果,调用operateBinary,输入为a,b和接口subtraction
myApp.operateBinary(20, 10, subtraction));
}
}
Lambda表达式使用场景举例
本节主要参考lambda表达式示例和官网使用案例
还是不懂?
请参考以下几篇我觉得不错的文章: