目录
什么是Stream
- —个“流”
- 不易出错
- 简化代码
- 可读性/可维护性++
Stream 的API-创建 Stream
- Collection,stream()
- Stream.of
- String,chars()
- IntSteam.range()
Stream的API-中间操作
- 仍然返回Stream的操作
- filter
- map
- sorted
Stream的API-终结操作
- 返回非'Stream'的操作,包括void
- 一个流只能被消费一次
- forEach
- count/max/min
- findFirst/findAny
- anyMatch/noneMatch
- —collect
collector与Collectors
- collect操作是最强大的操作
- toSet/toList/toCollection
- joining。
- toMap()
- groupingBy()
并发流
- parallelStream()
- 可以通过并发提高互相独立的操作的性能
- 在正确使用的前提下,可以获得近似线性的性能提升
- 但是!使用要小心,性能要测试,如果你不知道自己在做什 么,就忘了它吧。
// 使用流的方法,把所有长度等于1的单词挑出来,然后用逗号连接起来
// 例如,传入参数words=['a','bb','ccc','d','e']
// 返回字符串a,d,e
public static String filterThenConcat(Set<String> words) {
return words.stream()
.filter(word -> word.length() == 1)
.collect(Collectors.joining(","));
}
参考文献 Effective Java
第七章 Item 42-48
创建流:
- 所有的 Collection 集合都可以通过 stream 默认方法获取流;
- Stream 接口的静态方法 of 可以获取数组对应的流。
-
根据Collection获取流
public static void main(String[] args) { List
list = new ArrayList<>(); Stream stream1 = list.stream(); Set set = new HashSet<>(); Stream stream2 = set.stream(); Vector vector = new Vector<>(); Stream stream3 = vector.stream(); } -
根据Map获取流
Map不是Collection的子接口,K-V不符合流元素单一特性
public static void main(String[] args) { List
list = new ArrayList<>(); Stream stream1 = list.stream(); Set set = new HashSet<>(); Stream stream2 = set.stream(); Vector vector = new Vector<>(); Stream stream3 = vector.stream(); } -
根据数组获取流
public static void main(String[] args) { String[] array = { "张无忌", "张翠山", "张三丰", "张一元" }; Stream
stream = Stream.of(array); } -
String.chars()
// 使用流的方法,再把之前的题目做一遍吧 // 统计一个给定的字符串中,大写英文字母(A,B,C,...,Z)出现的次数。 // 例如,给定字符串"AaBbCc1234ABC",返回6,因为该字符串中出现了6次大写英文字母ABCABC public static int countUpperCaseLetters(String str) { return (int) str.chars().filter(Character::isUpperCase).count(); }
方法名 | 方法作用 | 方法种类 | 是否支持链式调用 |
---|---|---|---|
count | 统计个数 | 终结 | 否 |
forEach | 逐一处理 | 终结 | 否 |
filter | 过滤 | 函数拼接 | 是 |
limit | 取用前几个 | 函数拼接 | 是 |
skip | 跳过前几个 | 函数拼接 | 是 |
map | 映射 | 函数拼接 | 是 |
concat | 组合 | 函数拼接 | 是 |
收集到集合中
Stream流提供 collect 方法,其参数需要一个 java.util.stream.Collector<T,A, R> 接口对象来指定收集到哪种
集合中。 java.util.stream.Collectors 类提供一些方法,可以作为 Collector 接口的实例:
public static
public static
练习
// 编写一个方法,筛选出年龄大于等于60的用户,然后将他们按照年龄从大到小排序,将他们的名字放在一个LinkedList中返回
public static LinkedList<String> collectNames(List<User> users) {
return users.stream()
.filter(user -> user.age >= 60)
.sorted(Comparator.comparing(User::getAge).reversed())
.map(User::getName).collect(Collectors.toCollection(LinkedList::new));
}
「资料来源:饥人谷」