Lambda表达式是java8中最重要的新功能之一。使用Lambda表达式可以替换只有一个抽象函数的接口实现,告别匿名内部类,代码看起来更简洁易懂。Lambda表达式同时还提升了对集合、框架的迭代、遍历、过滤数据的操作。
原理的数组排序:
public class LambdaDemo {
/**
* 自定义比较器,根据字符串排序
* @param args
*/
public static void main(String[] args) {
List list = Arrays.asList("java", "javascript", "php", "python");
Collections.sort(list, new Comparator() {
@Override
public int compare(String o1, String o2) {
return o1.length() - o2.length();
}
});
System.out.println(list);
}
}
现在Lambda表达式:
/**
* Lambda表达式的数组排序
* @param args
*/
public static void main(String[] args) {
List list = Arrays.asList("java", "javascript", "php", "python");
Collections.sort(list, Comparator.comparingInt(String::length));
list.forEach(System.out::print);
}
Lambda表达式特点:
Lambda表达式应用场景:
函数式接口:
函数式接口类型:
(1)功能性接口:Function
(2)断言性接口:Predicate
(3)供给性接口:Supplier
(4)消费性接口:Consumer
介绍:
函数式接口 |
参数类型 |
返回类型 |
用途 |
Consumer |
T |
void |
对类型T参数操作,无返回结果,包含方法 void accept(T t) |
Supplier |
无 |
T |
返回T类型参数,方法时 T get() |
Function |
T |
R |
对类型T参数操作,返回R类型参数,包含方法 R apply(T t) |
Predicate |
T |
boolean |
断言型接口,对类型T进行条件筛选操作,返回boolean,包含方法 boolean test(T t) |
通过函数式接口类型的返回值或者参数类型,对应表达式的参数和返回值,可以决定表达式的写法。
表达式案例:
()->{}
()->{System.out.println("aaa");} // 表示没有参数,没有返回值,方法体一行代码
()->System.out.println("aaa") // 等价于上一个,因为方法只有一行代码可以省略{}
(a)->System.out.println(a) // 等价于上一个,因为方法只有一行代码可以省略{},消费性接口:Consumer
()->{return 100} // 抽象方法没有参数,有一个int返回值,供给性接口:Supplier的表示类型
()->return 100 // 抽象方法没有参数,有一个int返回值,等价于上一个
(int x)->{return x+1;} // 抽象方法有一个int参数,返回一个int值,参数类型可以省略,如下
(x)->x+1 // 表示方法需要一个参数,返回一个int类型
x->x+1
(a)->return a.length() // 返回值和传入值的类型不同,功能性接口:Function
方法引用:
Stream :
是一组用来处理数组、集合的API
Stream 特性:
filter、collect:
返回过滤后的结果,收集成为一个新的集合。打印新集合
List list = Arrays.asList(1, 2, 3, 4, 5);
List collect = list.stream().filter(x -> x % 2 == 0).collect(Collectors.toList());
collect.forEach(System.out::println);
sum:
将流的元素求和
List list = Arrays.asList(1, 2, 3, 4, 5);
int sum = list.stream().filter(x -> x % 2 == 0).mapToInt(x->x).sum();
System.out.println(sum);
max:
求出流最大值
List list = Arrays.asList(1, 2, 3, 4, 5);
Optional max = list.stream().max((a, b) -> a - b);
System.out.println(max.get());
findAny/findFirst:
从流中取值(随机取值/取第一个值)
List list = Arrays.asList(1, 2, 3, 4, 5);
Optional any = list.stream().findAny();
Optional first = list.stream().findFirst();
System.out.println(any);
System.out.println(first);
sorted:
排序
List list = Arrays.asList(1, 2, 3, 4, 5);
Stream sorted = list.stream().sorted(); // 自然排序
Stream mySorted = list.stream().sorted((a,b)->b-a); // 从小到大排序
distinct:
去重
List list = Arrays.asList(1, 2, 3, 4, 5, 5, 3, 6, 2);
list.stream().distinct().forEach(System.out::println);