一.什么是Lambda表达式?
Lambda表达式是JDK1.8开始之后的新技术,是一种代码的新语法。 作用:“**核心目的是为了简化匿名内部类的代码写法**”。
1.Lambda格式:
(匿名内部类被重写方法的形参列表) -> {
被重写方法的方法体代码。
}
2.Lambda表达式的使用前提:
(1)Lambda表达式并不能简化所有匿名内部类的写法。
(2)Lambda表达式只能简化**接口中只有一个抽象方法的匿名内部类形式。
3.例子:
在java中,可以使用lambda表达式的大多数都会用注解@FunctionalInterface来标识。
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
在创建线程时,我们使用的Runnable接口中就有这个标识注解,表示这个接口中只有一个抽象方法,且可以使用lambda表达式来进行简化代码。
在创建一个普通线程并开启时,我们常常使用以下代码:
Thread t = new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+":执行~~~");
}
});
意思就是我们通过匿名内部类的方式向线程的构造方法传入了一个Runnable对象。看看这个代码,都有个5,6行了,代码量有点多,让我们看看如何使用lambda表达式来简化这几行代码:
Thread t1 = new Thread(() -> {
System.out.println(Thread.currentThread().getName()+":执行~~~");
});
看到上面的变化没,我们在用图解的方式来解释一下:

- 在以前我们创建匿名内部类时,我们都会new一个接口并重写里面的方法,现在当接口只需要重写一个方法后,我们可以省略new接口的过程,只需要在()里面写上需要重写方法的参数列表,然后再{}里面需要重写的方法体,
()与{}之间用->连接。 - 其实lambda就是简化创建一个匿名内部类的代码。
其实在jdk8中有很多被@FuncationalInterface标识的接口,例如Comarator接口
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
}
当然你还会在Comparator接口中看到很多默认方法,这些对我们使用lambda是无关紧要的,因为我们最重要的是重写该接口中的一个方法。
二lambda表达式的省略写法
(在lamda表达式的基础上继续进行简化)
我们拿集合的forEach方法来举例:
(forEach中需要传入一个实现了Consumer接口的对象,可以查看Consumer接口是一个函数式接口,我们只需要重写其中的accept方法即可)
Collection<String> list=new ArrayList<String>();
list.add("李四");
list.add("张三");
list.add("王五");
list.add("王五");
list.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
})
//lambda
list.forEach((String s) -> {
System.out.println(s);
}
)
(1)如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写,同时要省略分号!
list.forEach((String s) -> System.out.println(s) )
(2)如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写。
此时,如果这行代码是return语句,必须省略return不写,同时也必须省略";"不写
(3)参数类型可以省略不写。
list.forEach((s) -> System.out.println(s) )
(4)如果只有一个参数,参数类型可以省略,同时()也可以省略。
list.forEach(s -> System.out.println(s) )
以上就是lambda的简化方案
三.总结
总之,记住,要使用lambad注解要拥有一下几点:
- lambda简化的是内部类代码
- 重写的接口中必须只有一个抽象方法,且接口被@FunctionalInterface注解修饰
本文介绍了Java 8中的Lambda表达式,这是一种简化匿名内部类代码的新语法。Lambda适用于只有一个抽象方法的接口,常与@FunctionalInterface配合使用。文中通过实例展示了Lambda的使用,包括Runnable接口在创建线程中的应用,并详细讲解了Lambda的省略写法,如省略大括号、参数类型等。最后总结了使用Lambda的条件:接口中只有一个抽象方法且被@FunctionalInterface注解。

被折叠的 条评论
为什么被折叠?



