- Lamada表达式 Java8新特性详解
- 1.介绍
- 1.1什么是lamada表达式
- 1.2语法格式
- 2.相关注意事项
- 2.1匿名内部类的注意事项
- 2.2省略注意
- 3.常用的接口使用lambda表达式
- 4.手写一个接口Inner1来实现lamda表达式
- 5.代码示例
lambda表达式代替了匿名内部类的写法, Java8之后的新特性
参数、返回值类型和要实现的接口的方法参数、返回值类型对应,语句表达式就是方法体
1.2语法格式格式:()->{} 、()-返回值
圆括号里放的是接口唯一方法的参数,大括号放的是表达式,后面或者是放的return语句的返回值
2.相关注意事项 2.1匿名内部类的注意事项匿名内部类的简写方式
1、实现某个接口
2、该接口中仅有 一个 抽象方法
3、抽象类不能使用Lambda表达式
1、参数类型可以省略
2、当方法中只有一行代码时,大括号可以省略
3、当方法中只有一行代码时,return关键字可以省略(大括号也要省)
4、当方法的参数列表中只有一个参数时,小括号可以省略
5、当方法的参数列表中没有参数时,小括号不能省略
| 接口 | 方法 | 参数 | 返回值 | 作用 | 使用场景 |
|---|---|---|---|---|---|
| Predicate | test(Object o) | Object o | boolean | 过滤规则 | 在list中使用removeIf()方法,过滤文件的操作listfiles()方法 |
| UnaryOperater | apply(Object o) | Object o | Object | 替代规则 | list集合中replaceAll()方法中使用 |
| Comparator | compare(Object o1,Object o2) | Object o1,Object o2 | int | 排序规则 | 配合list.sort()方者Collections.sort中排序使用 |
| Filefilter | accpt(File pathname) | File pathname | boolean | 文件过滤 | 在过滤文件的时候使用 |
| Comparable | compareTo(Object o) | Object o | int | 排序规则 | 在排序的时候使用 |
| BiConsumer | accept(K k,V v) | K k,V v | void | 遍历map集合 | 在遍历map的时候使用 |
| BiFunction | apply(K k,V v) | K k,V v | void | 元素替代 | 在map集合中的replaceAll()方法中使用 |
| Consumer | accept(T t) | T t | void | 消费性接口 | |
| Function | apply(T t) | T t | R | 函数型接口 | 对类型为T的对象进行操作 R apply(T t) |
()->{}:该匿名方法用于重写Inner中的抽象方法test
public class Demo2 {
public static void main(String[] args) {
Inner1 i1 = () -> {
System.out.println("test1");
};
i1.test1(); //调用方法
//计算1+2
Inner2 i2 = (a,b) -> {
System.out.println(a + b);
};
i2.test2(1,2);
}
}
interface Inner1 {
//无参数
void test1();
}
interface Inner2 {
void test2(int a, int b);
}
结果展示:
Lamada表达式 Java8新特性详解
5.代码示例使用一个集合实现排序,替换,删除过滤
import java.util.ArrayList;
import java.util.List;
public class Demo3 {
public static void main(String[] args) {
//得到一个集合并输出
System.out.println("原集合:");
List list = getList();
//将数字进行排序
System.out.println("排序后的结果:");
sortNumber(list);
//替换小于20的数为0
System.out.println("替换后的结果:");
System.out.println(replaceNumber(list));
//得到一个大于50的数字的集合
System.out.println("大于50的数字:");
List list1 = filterNumber(list);
System.out.println(list1);
//替代指定的元素
}
private static List getList() {
List list = new ArrayList<>();
list.add(1);
list.add(100);
list.add(34);
list.add(-1);
list.add(4);
list.add(95);
System.out.println(list);
return list;
}
private static List replaceNumber(List list){
//第一种方式,使用内部类:
// list.replaceAll(new UnaryOperator() {
// @Override
// public Integer apply(Integer integer) {
// if (integer < 20) {
// return 0;
// }
// return integer;
// }
// });
//第二种方式:使用lambda表达式:
list.replaceAll(integer -> {
if (integer < 20) {
return 0;
}
return integer;
});
return list;
}
private static void sortNumber(List list){
//第一种方式,使用内部类
// list.sort(new Comparator() {
// @Override
// public int compare(Integer o1, Integer o2) {
// if(o1>o2){
// return -1;
// }
// return 1;
// }
// });
//第二种使用lambda表达式
list.sort((o1, o2) -> {
if(o1>o2){
return 1;
}
return -1;
});
System.out.println(list);
}
private static List filterNumber(List list) {
//第一种方式,实现内部类
// list.removeIf(new Predicate() {
// @Override
// public boolean test(Integer integer) {
// return integer>=50;
// }
// });
//第二种方式 使用lambda表达式
list.removeIf(integer -> integer<=50);
return list;
}
}
结果展示:



