Lambda表达式
1.理解Functional Interface(函数接口) 是学习Java8 lambda表达式的关键所在
2.函数式接口的定义:
- 任何接口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口.
public interface Runnable{ public abstract void run(); }
-
对于函数式接口,就可以通过lambda表达式来创建该接口的对象
3.概念,用法:
(params) -> expression [表达式]
(params) -> statement [语句]
(params) -> { statements }
a -> System.out.println("I like Lambda" + a);
new Thread(() -> System.out.println("I like Lambda" )).start();
使用目的:
-
避免匿名内部类定义过多
-
可以让代码看起来简洁
-
去掉一些没有意义的代码,只留下核心逻辑
代码演示:
/*
退导Lambda表达式,
*********一定要按照顺序看***********
*/
public class TestLambda1 {
//3.静态内部类
static class Like2 implements ILike {
@Override
public void lambda() {
System.out.println("I like lambda2");
}
}
public static void main(String[] args) {
ILike like = new Like();
like.lambda();
like = new Like2();
like.lambda();
//4.局部内部类
class Like3 implements ILike {
@Override
public void lambda() {
System.out.println("I like lambda3");
}
}
like = new Like3();
like.lambda();
//5.匿名内部类,没有类名称,必须技术接口或者父类
like=new ILike() {
@Override
public void lambda() {
System.out.println("I like lambda4");
}
};
like.lambda();
//6.用Lambda简化
like=()-> {
System.out.println("I like lambda5");
};
like.lambda();
}
}
//1.定义一个函数式接口
interface ILike {
void lambda();
}
//2.实现类
class Like implements ILike {
@Override
public void lambda() {
System.out.println("I like Lambda");
}
}
回顾:
public class TestLambda2 {
// 2
// static class Love implements Ilove {
// @Override
// public void love(int a) {
// System.out.println("I Love you1 -->" + a);
// }
// }
public static void main(String[] args) {
//3
// class Love implements Ilove {
// @Override
// public void love(int a) {
// System.out.println("I Love you1 -->" + a);
// }
// }
//
// Ilove ilove = new Love();
// ilove.love(3);
// 4
// Ilove ilove=new Ilove() {
// @Override
// public void love(int a) {
// System.out.println("I Love you1 -->" + a);
// }
// };
// ilove.love(4);
// 5
// Ilove ilove= (int a) -> System.out.println("I Love Lambda1 -->" + a);
// ilove.love(5);
// 6
// Ilove ilove=(a)->System.out.println("I Love Lambda1 -->" + a);
// ilove.love(6);
// 6
// Ilove ilove = a -> System.out.println("I Love Lambda1 -->" + a);
// ilove.love(6);
// 7
// Ilove ilove2 = a -> {
// System.out.println("I Love Lambda1 -->" + a);
// System.out.println("I Love Lambda2 too");
// };
// ilove.love(7);
// 8
Ilove ilove3 = a -> {
System.out.println("I Love Lambda1 -->" + a);
System.out.println("I Love Lambda2 too");
};
ilove3.love(8);
ILove2 love2 = (a, b) -> {
System.out.println("I Love Lambda1 -->" + a);
System.out.println("I Love Lambda2 -->" + b);
};
love2.love(9, 10);
//总结:
//lambda表达式只能有一行代码的情况下才能简化成为一行,如果有有多行,那么就用代码块包裹
//前提是接口为函数式接口(一个接口只有一个方法)
//多个参数可以去掉参数类型(要么都不带类型,要么都带类型),必须加括号
}
}
interface ILove2 {
void love(int a, int b);
}
interface Ilove {
void love(int a);
}
//1
//class Love implements Ilove {
// @Override
// public void love(int a) {
// System.out.println("I Love you1 -->" + a);
// }
//}
回顾最终简化版:
public class TestLambda3 {
public static void main(String[] args) {
Ilook look1 = a -> System.out.println("look you-->" + a);
//总结:
//lambda表达式只能有一行代码的情况下才能简化成为一行,如果有有多行,那么就用代码块包裹
//前提是接口为函数式接口(一个接口只有一个方法)
//多个参数可以去掉参数类型(要么都不带类型,要么都带类型),必须加括号
look1.look(1);
}
}
interface Ilook {
void look(int a);
}