一、Lambda表达式的优点
1)JDK8开始支持Lambda表达式,用来让程序编写更优雅
2)利用Lambda可以更简洁的实现匿名内部类和函数声明与调用
3)基于Lambda提供stream流式处理极大简化对集合的操作
实现集合排序传统代码
List names = Arrays.asList("peter","anna","mike");
Collections.sort(names, new Comparator() {
@Override
public int compare(String a, String b) {
return b.compareTo(a);
}
});
使用Lambda表达式实现上述功能
List names = Arrays.asList("peter","anna","mike");
Collections.sort(names, (a, b) -> b.compareTo(a));
二、Lambda表达式语法格式
Lambda表达式只能实现有且仅有一个抽象方法的接口,称之为函数式接口
三、函数式编程
函数式编程是基于函数式接口并使用lambda表达的编程方式。
函数式编程理念是将代码作为可重用数据带入到程序运行中。函数式编程强调“你想做什么”而不是“你想怎么做”。如下
public void test(){
List list = Arrays.asList(1,2,3,4,5,6,7,8,9);
filter(list, n -> n%2 == 1);
filter(list, n -> n%2 == 0);
}
public static void filter(List list, Predicate predicate) {
for (Integer num: list) {
if(predicate.test(num)){
System.out.printf(num+"");
}
}
}
函数式接口是有且仅有一个抽象方法的接口。Java中有大量的函数式接口,如java.lang.Runnable。Java8提供一系列新的函数式接口,位于java.util.function。
Predicate
Consumer
IntConsumer: 参数是整数的Consumer
Function
自定义函数式接口时可以使用@FunctionalInterface注解, 通知编译器这是函数式接口,进行抽象方法检查,也可以不加。
四、函数式编程与面向对象编程对比
五、Stream流式处理
Stream流式处理是建立在Lambda基础上的多数据处理技术,Stream对集合数据处理进行高度抽象,极大简化代码量。Stream可对集合进行迭代、去重、筛选、排序、聚合等一系列处理。
// 获取List集合中最大的偶数
Optional op = Arrays.asList(1,2,3,4,5,6,7,8,9).stream()
.filter(x -> x%2 == 0)
.sorted((a,b) -> b-a)
.findFirst();
System.out.println(op.get());
流式处理常用方法
collect: 对流数据进行收集,生成新的List/Set
方法使用实例
// 偶数求和
List list = Arrays.asList("1","2","3","4");
int sum = list.stream()
.mapToInt(s -> Integer.parseInt(s))
.filter(num -> num%2 == 0)
.sum();
// 首字母转大写
List list = Arrays.asList("lily","andy","jack","smith");
List result = list.stream()
.map(s -> s.substring(0,1).toUpperCase() + s.substring(1))
.collect(Collectors.toList());
// 将所有奇数从小到大排序,且不许出现重复
List list = Arrays.asList(11, 2, 38, 4, 52, 6, 7, 11);
List result = list.stream()
.distinct() //去除重复流数据
.filter( n -> n%2 == 1)
.sorted((a,b) -> b-a) //排序
.collect(Collectors.toList());
六、流对象的五种创建方式
1)基于数组进行创建
String[] arr = {"Lily", "Andy", "Jackson"};
Stream stream = Stream.of(arr);
stream.forEach(s -> System.out.println(s));
2)基于集合进行创建
List list = new ArrayList<>();
list.add("Lily");
list.add("Andy");
Stream stream = list.stream();
3)利用generate方式创建无限长度流
Stream stream = Stream.generate(() -> new Random().nextInt(100000));
stream.limit(10).forEach(i -> System.out.println(i));
4)基于迭代器创建流
Stream stream = Stream.iterate(1, n -> n+1).limit(100);
5)基于字符序列创建流
// 可以处理汉字,会自动转为unicode码
String str = "abcdefg嘿嘿";
IntStream stream = str.chars();
stream.forEach(c -> System.out.println((char)c));