Java8给我们推出了很多新的语法,它允许以声明性方式处理数据集合。正是由于Sream的出现,让我们,我们可以通过简洁的代码,告别了以往使用for循环处理数据集合的历史。
使用Stream两部曲
- 把集合转换为stream
- 操作stream流,stream流在管道中经过中间操作符的处理,最后由最终操作符得到一系列处理的结果
中间操作符
流方法 | 含义 |
---|---|
filter | 过滤出元素 |
distinct | 返回一个无重复元素的流 |
limit | 返回一个不限定长度的流 |
skip | 截取索引为n到结束的流并返回 |
map | 接受一个函数作为参数。这个函数会被应用到每个元素上,并将其映射成一个新的元素。 |
sorted | 返回排序后的流 |
示例代码:
1)filter
List<String> strings = Arrays.asList("Hans", "Jim", "Hardy", "Andy", "Sherry", "", "Kate");
List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
System.out.println("保留非空字符串:" + filtered);
[Hans, Jim, Hardy, Andy, Sherry, Kate]
2)distinct
List<String> strings = Arrays.asList("Hans", "Jim", "Hardy", "Andy", "Sherry", "Kate", "Jim", "Hans");
List<String> filtered = strings.stream().distinct().collect(Collectors.toList());
System.out.println(filtered);
[Hans, Jim, Hardy, Andy, Sherry, Kate]
3)limit
List<String> strings = Arrays.asList("Hans", "Jim", "Hardy", "Andy", "Sherry", "Kate", "Jim", "Hans");
List<String> filtered = strings.stream().limit(4).collect(Collectors.toList());
System.out.println(filtered);
[Hans, Jim, Hardy, Andy]
4)skip
List<String> strings = Arrays.asList("Hans", "Jim", "Hardy", "Andy", "Sherry", "Kate", "Jim", "Hans");
List<String> filtered = strings.stream().skip(4).collect(Collectors.toList());
System.out.println(filtered);
[Sherry, Kate, Jim, Hans]
5)map
List<String> strings = Arrays.asList("Hans", "Jim", "Hardy", "Andy", "Sherry", "Kate", "Jim", "Hans");
List<String> strings2 = strings.stream().map(item -> item + " from China").collect(Collectors.toList());
System.out.println(strings2);
[Hans from China, Jim from China, Hardy from China, Andy from China, Sherry from China, Kate from China, Jim from China, Hans from China]
6)sorted
List<Integer> strings = Arrays.asList(5, 9, 7, 9, 6);
List<Integer> strings2 = strings.stream().sorted().collect(Collectors.toList());
System.out.println(strings2);
[5, 6, 7, 9, 9]
终止操作符
流方法 | 含义 |
---|---|
anyMatch | 检查是否有匹配元素,返回boolean |
allMatch | 检查是否匹配所有元素,返回boolean |
noneMatch | 检查是否没有匹配所有元素,返回boolean |
findAny | 将返回当前流中的任意元素 |
findFirst | 返回当前流的第一个元素 |
forEach | 遍历当前的流 |
collect | 将流收集起来转换为其他形式 |
reduce | 可以将流中元素反复结合起来,得到一个值 |
count | 返回流中元素个数 |
示例代码
1)anyMatch
List<Integer> strings = Arrays.asList(5, 9, 7, 9, 6);
boolean result = strings.stream().anyMatch(item -> item == 9);
System.out.println(result);
2)allMatch
List<Integer> strings = Arrays.asList(5, 9, 7, 9, 6);
boolean result = strings.stream().allMatch(item -> item == 9);
System.out.println(result);
3)noneMatch
// 当期流中包含9,因此不是全部不满足,所以返回false
List<Integer> strings = Arrays.asList(5, 9, 7, 9, 6);
boolean result = strings.stream().noneMatch(item -> item == 9);
System.out.println(result);
// 当期流中不包含4,因此全部不满足,所以返回true
List<Integer> strings = Arrays.asList(5, 9, 7, 9, 6);
boolean result = strings.stream().noneMatch(item -> item == 4);
System.out.println(result);
4)findAny
List<Integer> strings = Arrays.asList(5, 9, 7, 9, 6);
Optional<Integer> result = strings.stream().findAny();
System.out.println(result.get());
5)findFirst
List<Integer> strings = Arrays.asList(4, 9, 7, 9, 6);
Optional<Integer> result = strings.stream().findFirst();
System.out.println(result.get());
6)forEach
List<Integer> strings = Arrays.asList(4, 9, 7, 9, 6);
strings.stream().forEach(s -> System.out.print(s + " "));
输出结果:
4 9 7 9 6
7)collect
List<Integer> strings = Arrays.asList(4, 9, 7, 9, 6);
Set<Integer> set = strings.stream().collect(Collectors.toSet());
List<Integer> list = strings.stream().collect(Collectors.toList());
System.out.println(set);
System.out.println(list);
8)reduce
List<Integer> strings = Arrays.asList(4, 9, 7, 9, 6);
//方法一
Optional<Integer> reduce1 = strings.stream().reduce((acc, item) -> {
return acc + item;
});
System.out.println(reduce1);
//方法二,初始值为2
Integer reduce2 = strings.stream().reduce(2, (acc, item) -> {
return acc + item;
});
System.out.println(reduce2);
输出如下:
Optional[35]
37
9)count
List<Integer> strings = Arrays.asList(4, 9, 7, 9, 6);
long result = strings.stream().count();
System.out.println(result);
当前流的长度为5,因此输出如下:
5