跳转至

c. lambda表达式

c. lambda表达式

更新日期:2021-01-11


1. 概述

lambda表达式是Java8中引入的新特性,用来实现函数式编程。 lambda为了简化代码增强可读性而生,但是因为使用的人不多,且使用的不规范,反而造成了代码可读性变差并难以维护。

使用简单的功能,写出简单的lambda表达式会是明智的选择。

2. Stream

Stream类是lambda表示式的核心,是必须要掌握的。

先看看如果获取一个Stream对象。

获取Stream对象

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// 获取Stream对象
// 从值
var stream0 = Stream.of(1, 2, 3, 4, 5);
// 从数组
var stream1 = Arrays.stream(new int[]{1, 2, 3, 4, 5});
// 从List
var stream2 = List.of("1", "name", "score", "color").stream();
// 从集合
var stream3 = Set.of(333, 456, 789).stream();
// 从Map
var stream4 = Map.of("name", "lilei", "score", 88).entrySet().stream();

再来看看使用Stream可以进行的操作。(有一部分看起来很难使用的不包含在内)

No. 函数 说明
1 allMatch、anyMatch、noneMatch 判断流中的元素是否满足指定的条件
2 collect 进行集约处理,常用来最后一步返回List或数组之类的结果
3 concat 串联两个流
4 count 统计流中元素的数量。比如一顿筛选之后统计数量
5 distinct 去除重复元素
6 filter 筛选元素
7 findAny、findFirst 返回元素
8 flatMap系列 映射元素到另一种类型(很少使用)
9 map系列 映射元素到另一种类型
10 forEach系列 遍历元素
11 limit 为流指定最大元素个数的限制
12 max、min 最大值、最小值
13 of 从一系列值生成Stream对象
14 skip 跳过前n个元素
15 sorted 排序
16 toArray 将结果转换成数组

这些操作的作用都是显而易见的。不太容易掌握的是结果的使用方法。

结果转换

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// 结果转换
// 单个元素
Integer firstNumber = Stream.of(1, 2, 3, 4, 5, 10, 11, 12, 20, 21, 22).findFirst().get();
int firstNum = Stream.of(1, 2, 3, 4, 5, 10, 11, 12, 20, 21, 22).findFirst().orElse(0);
// 数组
Integer[] newNums = Stream.of(1, 2, 3, 4, 5, 10, 11, 12, 20, 21, 22).filter(n -> n < 4).toArray(Integer[]::new);
// List
List<Integer> newNums2 = Stream.of(1, 2, 3, 4, 5, 10, 11, 12, 20, 21, 22).filter(n -> n < 4).collect(Collectors.toList());
// 集合
Set<Integer> newNum3 = Stream.of(1, 2, 3, 4, 5, 10, 11, 12, 20, 21, 22).filter(n -> n < 4).collect(Collectors.toSet());
// 分组后转换为Map
Map<Integer, List<Integer>> newMap = Stream.of(1, 2, 3, 4, 5, 10, 11, 12, 20, 21, 22).collect(Collectors.groupingBy(n -> n / 10));

最后,记住要书写简单的lambda表达式。再有多个操作时每个操作要单独放一行,这样更容易阅读。

具有多个操作的lambda表达式

1
2
3
4
5
6
7
// 集合
Set<String> newNum3 = Stream.of(1, 2, 3, 4, 5, 10, 11, 12, 20, 21, 22)
        .filter(n -> n > 4)
        .limit(4)
        .map(n -> String.valueOf(n))
        .collect(Collectors.toSet());
System.out.println(newNum3);