1、Lambda表达式的概念
Lambda表达式,也可称为闭包。类似于JavaScript中的闭包,它是推动Java8发布的最重要的新特性。
作用:
lambda运行将函数作为一个方法的参数,也就是函数作为参数传递到方法中。使用lambda表达式可以让代码更加简洁。
lambda表达式,只能实现函数式接口。
2、Lambda表达式的语法
1.函数式接口
如果说,⼀个接口中,要求实现类必须实现的抽象方法,有且只有⼀个!这样的接口,就是函数式接口。
interface Test{
public void test();
}
2.@FunctionalInterface
是⼀个注解,用在接口之前,判断这个接口是否是⼀个函数式接口。 如果是函数式接口,没有任何问题。如果不是函数式接口,则会报错。功能类似于 @Override。
@FunctionalInterface
interface Test{
public void test();
}
报错情况:
3.Lambda表达式的语法
Lambda表达式的基础语法
lambda表达式的基础语法:
接口 接口名 (参数1,参数2,…) -> {
方法体
};
接口:需要实现的函数式接口
参数部分:方法的参数列表,要求和实现的接口中的方法参数部分⼀致,包括参数的数量和类型。
方法体部分 : 方法的实现部分,如果接口中定义的方法有返回值,则在实现的时候,注意返回值的返回。
-> : 分隔参数部分和方法体部分。
代码示例:
1.无参无返回值
public interface Test {
public void test();
}
public class TestImpl {
public static void main(String[] args) {
Test test = () -> {
System.out.println("无参无返回值的使用");
};
test.test();
}
}
运行结果:
2.有参无返回值
public interface Test {
public void test(String name);
}
public class TestImpl {
public static void main(String[] args) {
Test test = (name) -> {
System.out.println(name+"的使用");
};
test.test("有参无返回值");
}
}
运行结果:
3.无参有返回值
public interface Test {
public String test();
}
public class TestImpl {
public static void main(String[] args) {
Test test = () -> {
return "无参有返回值的使用";
};
String str = test.test();
System.out.println(str);
}
}
运行结果:
4.有参有返回值
public interface Test {
public String test(String name);
}
public class TestImpl {
public static void main(String[] args) {
Test test = (name) -> {
return name+"的使用";
};
String str = test.test("有参有返回值");
System.out.println(str);
}
}
运行结果:
方法体部分与参数部分的精简
参数部分的精简
参数的类型
由于在接口的方法中,已经定义了每⼀个参数的类型是什么。而且在使用lambda表达式实现接口的时候,必须要保证参数的数量和类 型需要和接口中的方法保持⼀致。因此,此时lambda表达式中的参数的类型可以省略不写。
参数的小括号
如果方法的参数列表中的参数数量 有且只有⼀个,此时,参数列表的小括号是可以省略不写的。
public interface Test {
public String test(String name);
}
public class TestImpl {
public static void main(String[] args) {
Test test = name -> {
return name+"的使用";
};
String str = test.test("有参有返回值");
System.out.println(str);
}
}
方法体部分的精简
方法体⼤括号的精简
当⼀个方法体中的逻辑,有且只有⼀句的情况下,⼤括号可以省略
public interface Test {
public void test(String name);
}
public class TestImpl {
public static void main(String[] args) {
Test test = name -> System.out.println(name+"方法体⼤括号的精简");
test.test("这是");
}
}
运行结果:
return的精简
如果⼀个方法中唯⼀的⼀条语句是⼀个返回语句, 此时在省略掉大括号的同时, 也必须省略掉return。
public interface Test {
public String test(String name);
}
public class TestImpl {
public static void main(String[] args) {
Test test = name -> name+"return的精简";
String str = test.test("这是");
System.out.println(str);
}
}
运行结果:
3.Lambda表达式的优缺点
- 优点:
- 使代码更简洁,紧凑
- 可以使用并行流来并行处理,充分利用多核CPU的优势
有利于JIT编译器对代码进行优化
- 缺点:
- 非并行计算情况下,其计算速度没有比传统的 for 循环快
- 不容易调试
- 若其他程序员没有学过 Lambda 表达式,代码不容易看懂