1、lambda表达式
- 避免匿名内部类定义过多
- 其实质是属于函数式编程的概念
- (params)-> expression[ 表达式 ]
- (params)-> statement[语句 ]
- (params)-> {statements}
2、函数式接口
-
任何接口、如果只包含唯一一个抽象方法,那么它就是一个函数式接口
public interface Runnable{ public abstract void run(); }
-
对于函数式接口,可以通过lambda表达式来创建该接口的对象
3、演化进程
//函数式接口
public interface Person {
void speak(String str);
}
//方式一: 接口实现类
class p1 implements Person{
@Override
public void speak(String str) {
System.out.println(str);
}
}
public class LanmbdaTest {
//方式二:静态内部类
static class p2 implements Person{
@Override
public void speak(String str) {
System.out.println(str);
}
}
public static void main(String[] args) {
//方式三:局部内部类
class p3 implements Person{
@Override
public void speak(String str) {
System.out.println(str);
}
}
Person p1 = new p1();
p1.speak("1");
Person p2 = new p2();
p2.speak("2");
Person p3 = new p3();
p3.speak("3");
//方式四:匿名内部类
Person p4 = new Person() {
@Override
public void speak(String str) {
System.out.println(str);
}
};
p4.speak("4");
//方式五:lambda表达式
Person p5=(String str)->{
System.out.println(str);
};
p5.speak("5");
}
}
4、Lambda的简化
public class LambdaTest2 {
public static void main(String[] args) {
//常态
Person p1 = (String str) -> {
System.out.println(str);
};
//简化1:去掉类型
Person p2 = (str) -> {
System.out.println(str);
};
//简化2:去掉括号
Person p3 = str -> {
System.out.println(str);
};
//简化3:去掉花括号
Person p4 = str -> System.out.println(str);
p1.speak("1");
p2.speak("2");
p3.speak("3");
p4.speak("4");
}
}
-
总结
-
lambda 表达式只有一行代码的情况下,才能简化成一行。多行的时候得用{ }包裹
p = str->{ System.out.println(str); System.out.println(str); }
-
lambda表达式才多参数的时候,也可以去掉参数类型,去掉就得都去掉。
-
lambda表达式只有一个参数的情况下,才能去掉括号。多参数的时候得加上括号
p = (str1,str2)->{ System.out.println(str1); System.out.println(str2); }
-