Java中的lambda表达式是Java 8引入的一个重要特性,它提供了一种简洁、灵活的方式来表示匿名函数。Lambda表达式可以用来表示接口的一个实现,而这个接口必须只有一个抽象方法,这样的接口被称为函数式接口(Functional Interface)。
Lambda表达式的语法
Lambda表达式的一般语法为:
(parameters) -> expression
或者
(parameters) -> { statements; }
parameters
:参数列表,可以省略参数的类型,如果只有一个参数且其类型可推导,甚至可以省略括号。->
:lambda操作符,用来分隔参数列表和lambda体。expression
:当lambda表达式有一个表达式时,直接写表达式即可,该表达式的结果就是lambda表达式的结果。statements
:当lambda表达式包含多个语句时,需要用花括号括起来,类似于方法体。
示例
// 无参数的lambda表达式
Runnable r = () -> System.out.println("Hello World");
// 带有一个参数的lambda表达式
Consumer<String> c = (s) -> System.out.println(s);
// 等价于上面的lambda表达式,参数类型可推导,省略括号
Consumer<String> c = s -> System.out.println(s);
// 带有两个参数的lambda表达式,并包含多个语句
BiFunction<Integer, Integer, Integer> adder = (a, b) -> {
int sum = a + b;
return sum;
};
函数式接口
Lambda表达式通常与函数式接口一起使用。函数式接口是定义在java.util.function
包中的接口,它们代表了一种行为,可以被用作lambda表达式的类型。
例如,Runnable
是一个函数式接口,它有一个抽象方法run()
,可以这样使用lambda表达式:
new Thread(() -> System.out.println("Hello from lambda")).start();
使用场景
Lambda表达式可以用在任何需要函数式接口的地方,例如:
- 集合的操作,如
forEach
方法。 - 并发编程,如
ExecutorService
的execute
方法。 - GUI事件处理,如按钮点击事件。
- 流(Stream)API的操作,如
map
、filter
、sorted
等。
优点
- 代码简洁:Lambda表达式使得代码更加简洁,减少了模板代码。
- 提高可读性:清晰的表达了意图,使得代码更易于理解。
- 灵活性:可以作为参数传递给方法,使得代码更加灵活。
注意事项
- Lambda表达式不适用于所有场景,有时候匿名内部类能提供更多的功能。
- 当Lambda表达式中访问外部局部变量时,变量必须是final的,或者实际上没有被后续代码修改,即effectively final。
- 在高并发场景下,需要注意线程安全问题。
Lambda表达式是现代Java编程中不可或缺的一部分,它提供了一种强大的方式来处理函数式编程的概念,使得代码更加简洁和灵活。
示例一
package lambda;
/*
推导lambda表达式
*/
public class TestLambda {
//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();
Ilike ilike2=new Like2();
ilike2.lambda();
//4、局部内部类
class Like3 implements Ilike{
@Override
public void lambda() {
System.out.println(" I like lambda3 !");
}
}
Ilike like3=new Like3();
like3.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 !");
}
}
运行结果
示例一代码简化
package lambda;
public class TestLambda2 {
public static void main(String[] args) {
//1、lambda表示简化
Ilove love=(int a)->{
System.out.println("I love you!**"+a);
};
//简化1: 参数类型
love=( a)->{
System.out.println("I love you!**"+a);
};
//简化2:简化括号
love =a -> System.out.println("I love you!**"+a);
//简化3:去掉花括号
love =a -> {
System.out.println("I love you!**"+a);
};
love.love(520);
/*
总结:
lambda表达式只能用一行代码的情况下,才能简化为一行,如果有多行,那么就用代码块包裹。
前提是函数式接口
多个参数也可以去掉参数类型,要去掉就都去掉,必须加上括号
*/
}
}
interface Ilove{
void love(int a);
}