Lambda表达式
为什么要使用lambda表达式
- 避免匿名内部类定义过多
- 可以让你的代码看起来很简洁
- 去掉了一堆没有意义的代码,只留下核心的逻辑。
也许你会说,我看了Lambda表达式,不但不觉得简洁,反而觉得更乱,看不懂了。
那是因为我们还没有习惯,用的多了,看习惯了,就好了。
理解Function Interface(函数式接口)是学习java8 lambda表达式的关键所在
函数式接口的定义:
1.任何接口,如果包含唯一的抽象方法,那么它就是一个函数式接口
public interface Runnable{
public abstract void run();
}
2.对于函数式接口,我们可以通过Lambda表达式来创建该接口的对象
package com.qh.lambda;
/**
* Lambda的推导
* 根据序号看
*/
public class TestLambda {
//3.静态内部类,用 static 修饰的内部类
static class ILike2 implements Like{
@Override
public void lambda() {
System.out.println("I like Lambda2");
}
}
public static void main(String[] args) {
//创建ILike 对象
Like like = new ILike();
like.lambda();
like = new ILike2();
like.lambda();
//4.局部内部类,在方法中定义的内部类
class ILike3 implements Like{
@Override
public void lambda() {
System.out.println("I like Lambda3");
}
}
like = new ILike3();
like.lambda();
/**
* 5.匿名内部类,匿名类是指没有类名的内部类,必须在创建时使用 new 语句来声明类。
* 匿名类有两种实现方式:
* 继承一个类,重写其方法。
* 实现一个接口(可以是多个),实现其方法。
*/
like = new Like() {
@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 Like{
void lambda();
}
//2.实现类
class ILike implements Like{
@Override
public void lambda() {
System.out.println("I like Lambda");
}
}
//带参简化
public class TestLambda1 {
public static void main(String[] args) {
//使用lambda表达式
Print print = null;
//1.Lambda表达式简化
print = (int a)->{
System.out.println(a);
};
print.printNum(10);
//简化1,简化参数类型
print =(a) -> {
System.out.println(a);
};
print.printNum(10);
//简化2,简化括号
print = a ->{
System.out.println(a);
};
//简化3,去掉花括号
print = a -> System.out.println(a);
/**
* 总结:
* 前提接口是函数式接口;
* lambda表达式花括号中只能有一行代码的情况下,才能简化成一行,如果多行,只能用代码块包裹
* 多个参数也可以去掉参数类型,要去掉都去掉,必须加上括号
*
*/
}
}
interface Print{
void printNum(int a);
}