java8新特性之lamdba表达式
2022-07-28 本文已影响0人
糯米团子123
Lamdba表达式
使用lamdba表达式 使代码更加简洁。
- 表示格式
// 语法格式
(parametes) -> expression
// 多行语句执行
(parametes) -> {statements;}
//例如:
public int add(int x,int y){
return x+y;
}
// 有以下几种写法:
// 指定参数类型及return
(int x,int y) ->{return x+y}
// 指定参数类型 不指定return
(int x,int y) ->x+y
// 不指定参数类型和return 编译器自动判断
(x,y) ->x+y
// 示例:创建一个简单的线程
Runnable runnable = () -> System.out.println("我是一个线程")
- 用途
2.1 只有一个抽象方法的函数式接口
Lamdba表达式的目标类型是函数式接口,例如
// Runnable 接口只有一个方法 run(),使用时我们就可以这样写
Runnable runnable = () ->System.out.println("test1");
new Thread(runnable).start();
// 或者更简单一点儿还可以写成
new Thread(()->System.out.print("test2")).start();
// 或者
new Thread(()->run("test3")).start()
// 或者
new Thread(()->{
String str = "test4";
System.out.println("test4");
}).start();
2.2 批量集合
下面两种写法是等价的:
List<String> list = Arrays.asList("a","b","c");
for(String str : list){
System.out.println(str);
}
list.forEach((e)-> System.out.println(e));
2.3 流
下面是流查询list集合种等于“a”的数量。
list.stream().filter((e) -> "a".equals(e))).count();
- Lambda 表达式和匿名内部类之间的区别
3.1 编译方式不同:java编译器编辑lamdba表达式时,会将其转换为类的私有方法,再进行动态绑定。匿名内部类编译之后,产生单独的.class字节码文件
3.2 类型不同:lamdba只能是接口,匿名内部类可以是接口,也可以是抽象类。
3.3 使用限制不同:如果接口中有且仅有一个抽象方法可以使用lamdba和匿名内部类,如果有多于一个的抽象方法只能使用匿名内部类。