根据我的观察,Lambda是一种比较灵活的形式,需要多看几个案例才能明白它。
Lambda是一种简化代码的技术手段,主要用于简化匿名实现类,允许把函数作为一个方法的参数传递进方法中。它本身并不会创造出新的概念和功能来。不过现在很多开源项目都使用到这种技术,我的原则是能看懂别人代码即可。
Lamdba 优点:
如果你的代码中有地方需要接口回调套接口回调,有可能套了好几层,虽然这种情况出现的概率比较低,但是一旦出现这种代码,lambda表达式的这个简洁,就很适合这种场景。
Lamdba 缺点:
缺点也是它的简洁,由于省略了太多东西,代码可读性有可能在一定程度上会降低,这个完全取决于你使用lambda表达式的位置所设计的API是否被你的代码的其他阅读者所熟悉。
使用语法:
(参数类型 参数名, 数参数类型 参数名2...) -> {
// code
};
没有参数的案例
传统写法:
public static void general() {
// 用匿名内部类的方式来创建线程
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Hello World.");
}
}).run();
}
Lambda 写法:
public static void lambda() {
// 使用Lambda来创建线程
new Thread(() -> System.out.println("Hello Lambda!")).run();
}
有参数,有返回值的案例
1个参数,一个返回值
public static void oneParam() {
// Consumer<String> con = (s) -> System.out.println(s);
// 参数的小括号可以省略。
Consumer<String> con = s -> System.out.println(s);
con.accept("oneParam Test!");
}
2个参数,一个返回值
interface Calculator {
int calculate(int a, int b);
}
public class Main {
public static void main(String[] args) {
Calculator calculator = (a, b) -> a + b;
int result = calculator.calculate(5, 3);
System.out.println(result);
}
}
语法说明:
- (a,b) 参数类型是可以省略的,编译器会根据上下文推断出参数类型。当然,这种省略并不是必须的,你也可以显式地指定参数类型;
- a + b ,在Lambda表达式的主体中,如果主体只有一条表达式,那么这条表达式的结果将被隐式地作为Lambda表达式的返回值,并且这个大括号都是可以省略的。当然,你也可以使用了显式的return语句来返回结果。
和上面一样的代码,但是使用显示:
interface Calculator {
int calculate(int a, int b);
}
public class Main {
public static void main(String[] args) {
Calculator calculator = (int a, int b) -> {
return a - b;
};
int result = calculator.calculate(5, 3);
System.out.println(result);
}
}
函数式接口@FunctionalInterface
TODO