一、什么是 Stream 流?
- 简单来说,我们可以使用 java.util.Stream 对一个集合(包含一个或多个元素)做各种操作。
- 这些操作可能是 中间操作(中间操作会返回一个 Stream 流) 亦或是 终端操作(终端操作会返回一个结果)。
- 需要注意的是,你只能对实现了 java.util.Collection 接口的类做流的操作。
- Stream 流支持同步执行,也支持并发执行
二、操作
首先,我们创建一个 List 集合:
List<String> stringCollection = new ArrayList<>();
stringCollection.add("ddd2");
stringCollection.add("aaa2");
stringCollection.add("bbb1");
stringCollection.add("aaa1");
stringCollection.add("bbb3");
stringCollection.add("ccc");
stringCollection.add("bbb2");
stringCollection.add("ddd1");
(1)Filter 过滤
类型:中间操作
入参:是一个 Predicate(断言);
返参:是一个 Stream 流;
能够:帮我们筛选出我们需要的集合元素;
stringCollection
.stream()
.filter((s) -> s.startsWith("a"))
.forEach(System.out::println);
// "aaa2", "aaa1"
注意:foreach 是一个终端操作,它的返参是 void, 我们无法对其再次进行流操作。
(2)Sorted 排序
类型:中间操作;
入参:空 或者 一个比较器 Comparator ;
返参:是一个 Stream 流;
stringCollection
.stream()
.sorted()
.filter((s) -> s.startsWith("a"))
.forEach(System.out::println);
// "aaa1", "aaa2"
(3)Map 转换
类型:中间操作;
入参:Function(例如方法引用、lambda表达式);
返参:是一个 Stream 流;
能够:帮助我们将集合中的每一个元素做功能处理;
例如:下面的示例,通过 map 我们将每一个 string 转成大写:
stringCollection
.stream()
.map(String::toUpperCase)
.sorted((a, b) -> b.compareTo(a))
.forEach(System.out::println);
// "DDD2", "DDD1", "CCC", "BBB3", "BBB2", "AAA2", "AAA1"
(4)Match 匹配
类型:终端操作;
入参:Function(例如方法引用、lambda表达式);
返参:是一个 boolean 类型的值;
// 验证 list 中 string 是否有以 a 开头的, 匹配到第一个,即返回 true
boolean anyStartsWithA =
stringCollection
.stream()
.anyMatch((s) -> s.startsWith("a"));
System.out.println(anyStartsWithA); // true
// 验证 list 中 string 是否都是以 a 开头的
boolean allStartsWithA =
stringCollection
.stream()
.allMatch((s) -> s.startsWith("a"));
System.out.println(allStartsWithA); // false
// 验证 list 中 string 是否都不是以 z 开头的,
boolean noneStartsWithZ =
stringCollection
.stream()
.noneMatch((s) -> s.startsWith("z"));
System.out.println(noneStartsWithZ); // true
(5)Count 计数
类型:终端操作;
入参:无
返参:是一个 long 类型的值;
// 先对 list 中字符串开头为 b 进行过滤,让后统计数量
long startsWithB =
stringCollection
.stream()
.filter((s) -> s.startsWith("b"))
.count();
System.out.println(startsWithB); // 3
(6)Reduce 归约、减少
类型:终端操作;
入参:Function;
返参:是一个 Optional 类型的对象;
能够:将流中的元素按照指定的规约函数进行合并,得到一个最终的结果,用于求和、求最大值、求最小值等聚合操作;
Optional<String> reduced =
stringCollection
.stream()
.sorted()
.reduce((s1, s2) -> s1 + "#" + s2);
reduced.ifPresent(System.out::println);
// "aaa1#aaa2#bbb1#bbb2#bbb3#ccc#ddd1#ddd2"
(7)未完待续 … …