1. 匿名内部类
Lamda
表达式,读作λ
表达式,属于函数式编程范畴,目的是简化匿名内部类的实现。
先看看原来的匿名内部类是如何实现的。
interface SimpleSay {
void sayHi(String name);
}
public static void main(String[] args) {
// 传统匿名内部类实现方式
String myName = "lucy";
test(
new SimpleSay() {
@Override
public void sayHi(String name) {
System.out.println("Hello "+name);
}
}
, myName);
}
static void test(SimpleSay simpleSay, String name){
simpleSay.sayHi(name);
}
如果使用Lamda
表达式,就简单多了。
//lamda表达式
test(name -> {System.out.println("Hello "+name);}, myName);
2. Lamda
语法
- 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
- 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
- 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
- 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。
(parameters) -> expression
或
(parameters) ->{ statements; }
3. Lamda
示例
3.1 数学运算
public static void main(String[] args) {
//Lamda完整写法
MathOperation add = (int a, int b) -> {return a + b;};
//参数类型可以省略
MathOperation sub = (a, b) -> {return a - b;};
//只有一个参数,可以省略圆括号
MathOperation2 pow = a -> {return (a*a);};
//只有一条语句,可以省略大括号
MathOperation3 mul = (a, b) -> System.out.println("a * b = " + (a*b));
//只是一个表达式,可以省略 return 关键字
MathOperation div = (a, b) -> a / b ;
System.out.println("a + b = " + test(6, 3,add));
System.out.println("a - b = " + test(6, 3,sub));
System.out.println("a^2 = " + test2(6,pow));
test3(6, 3,mul);
System.out.println("a / b = " + test(6, 3,div));
}
interface MathOperation{ int operate(int a, int b); }
interface MathOperation2{ int operate(int a); }
interface MathOperation3{ void operate(int a, int b); }
static int test(int a,int b, MathOperation math) {return math.operate(a, b);}
static int test2(int a,MathOperation2 math) {return math.operate(a);}
static void test3(int a, int b,MathOperation3 math) {math.operate(a, b);}