记录自己在狂神说java中的学习情况,文章里有自己学习的理解和扩展,新手难免有理解偏差或者错误,恳请大佬指正。
Java自学(十、Java的Lambda表达式)
Lambda表达式
Lambda表达式是为了避免匿名内部类定义过多而设计的,其本质属于函数式编程的概念。是Java8的新特性。
语法:
(params) -> expression [表达式]
(params) -> statement [语句]
(params) -> {statement}
为什么要使用lambda表达式?
- 避免匿名内部类定义过多
- 可以让你的代码看起来很简洁
- 去掉了一堆没有意义的代码,只留下核心的逻辑
理解Functional Interface(函数式接口)是学习Java 8 lambda表达式的关键所在
函数式接口的定义:
- 任何接口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口
public interface Runnable{
public abstract void run();
}
- 对于函数式接口,我们可以通过lambda表达式来创建该接口的对象
不带参数的lambda表达式推导
package Lambda;
/*
推导lambda表达式
*/
public class LambdaUse {
//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();//lambda表达式使用
}
}
//1.定义一个函数式接口
interface iLike {
void lambda();
}
//2.实现类
class Like implements iLike {
@Override
public void lambda() {
System.out.println("i like lambda");
}
}
带参数的lambda表达式实现
package Lambda;
public class LambdaUseWithParam {
static class Love2 implements ILove {
@Override
public void love(String name) {
System.out.println("i love " + name);
}
}
public static void main(String[] args) {
ILove love = new Love();//普通类
love.love("张三");
love = new Love2();//静态内部类
love.love("李四");
class Love3 implements ILove {
@Override
public void love(String name) {
System.out.println("i love " + name);
}
}
love = new Love3();//局部内部类
love.love("王五");
love = new ILove() {//匿名内部类
@Override
public void love(String name) {
System.out.println("i love " + name);
}
};
love.love("吴六");
love = (String name) -> {//lambda表达式
System.out.println("i love " + name);
};
love.love("吕七");
// 接口 对象 =(参数类型 参数...) -> {具体实现}
// 对lambda表达式继续简化,代码只有一行的时候可以把花括号{}也去掉,参数只有一个的时候可以省略括号()
love = name -> System.out.println("i love " + name);
love.love("邓八");
}
}
interface ILove {
void love(String name);
}
class Love implements ILove {
@Override
public void love(String name) {
System.out.println("i love " + name);
}
}
总结
-
Lambda表达式的使用前提是接口为函数式接口
- 任何接口,如果只包含唯一一个抽象方法,则该接口为函数式接口
-
Lambda表达式:接口 对象 = (参数类型1 参数1, 参数类型2 参数2…) -> {具体的实现代码}
-
Ilove love = (String name)-> { System.out.println("i love "+name);};
-
- 如果参数只有一个,则可以把括号省略
- 参数类型也可以省略,但是多个参数的话,要么同时省略参数类型,要么同时不省略参数类型
- 如果{}里只有一行代码,可以把花括号省略