一、概述
1、作用
高效处理集合数据的API方法,仅负责处理数据而不负责保存数据。
中文可翻译为流式编程。
2、结构
StreamAPI在使用时分成三个部分:
- 第一部分:创建Stream对象
- 第二部分:数据的链式处理
- 第三部分:结束操作
3、特点
- 延迟执行:中间部分并不是立即执行,而是调用最终结束操作时才执行。如果没有最终结束操作则不执行。
- 一次性使用:一个Stream对象一旦调用了最终结束操作则无法再使用,必须重新创建才行。
二、操作
1、创建Stream对象
方式很多,这里我们重点关注两种形式:
- 串行流:java.util.Collection.stream()
- 并行流:java.util.Collection.parallelStream()
2、数据处理
①映射
Stream对象的map()方法接收Function类型的参数,集合中的每一个元素传入Function接口apply()方法,apply()方法内部可以对传入的集合元素做任意操作,最后提供一个返回值。
简单来说就是可以把集合元素映射为新的值。
List<String> nameList = Arrays.asList("aa","bb","cc","dd","ee");
nameList.stream().map(name -> name + "@").forEach(System.out::println);
②过滤
对每一个集合元素进行过滤,返回true的会被保留。
List<String> nameList = Arrays.asList("张飞","赵云","吕布","赵干","马超","甘宁");
nameList.stream().filter(name -> name.startsWith("赵")).forEach(System.out::println);
③去重
List<String> nameList = Arrays.asList("张飞","赵云","吕布","赵云","赵云","马超","赵云","甘宁");
nameList.stream().distinct().forEach(System.out::println);
④排序
无参的sort()方法是自然排序,默认是升序。此时要求被排序的数据类型实现了Comparable接口。
Arrays.asList("aa","bb","cc","dd","ee")
.stream()
.sorted()
.forEach(System.out::println);
有参的sort()方法是定制化排序,根据Comparator对象排序:
Arrays.asList(25,36,17,22,18,5,13,-4,86)
.stream()
.sorted(Integer :: compareTo)
.forEach(System.out::println);
降序排序:
Arrays.asList(25,36,17,22,18,5,13,-4,86)
.stream()
.sorted(Comparator.reverseOrder())
.forEach(System.out::println);
⑤截取
从开头开始截取指定数量的元素:
Arrays.asList(25,36,17,22,18,5,13,-4,86)
.stream()
.sorted()
.limit(5)
.forEach(System.out::println);
3、结束操作
在一个流中,结束操作只能有一个。
①forEach()
遍历经过中间处理之后的集合元素。
Arrays.asList(25,36,17,22,18,5,13,-4,86)
.stream()
.sorted()
.limit(5)
.forEach(System.out::println);
②toArray()
把经过处理后的集合数据转换为数组。
Object[] objects = Arrays.asList(25, 36, 17, 22, 18, 5, 13, -4, 86)
.stream()
.sorted()
.toArray();
③max()/min()
找出最大、最小元素。
Optional<Integer> optional = Arrays.asList(25, 36, 17, 22, 18, 5, 13, -4, 86)
.stream()
.max(Comparator.comparingInt(value0 -> value0));
Integer maxValue = optional.orElse(1000000);
System.out.println("maxValue = " + maxValue);
④count()
返回流中元素的个数。
long count = Arrays.asList(25, 36, -17, 22, -18, 5, 13, -4, 86)
.stream()
.filter(value -> value > 0)
.count();
System.out.println("count = " + count);
⑤reduce()
归纳
Integer value = Arrays.asList(25, 36, -17, 22, -18, 5, 13, -4, 86)
.stream()
.reduce(Integer::sum)
.get();
System.out.println("value = " + value);
⑥anyMatch()/allMatch()/noneMatch()
- anyMatch():返回boolean值,表示流中的集合元素是否有任何一个匹配断言
- allMatch():返回boolean值,表示流中的集合元素是否全部匹配断言
- noneMatch():返回boolean值,表示流中的集合元素是否全部都不匹配断言
boolean matchResult = Arrays.asList("张飞", "赵云", "吕布", "赵干", "马超", "甘宁")
.stream()
.anyMatch(name -> name.startsWith("赵"));
System.out.println("matchResult = " + matchResult);
matchResult = Arrays.asList("张飞", "赵云", "吕布", "赵干", "马超", "甘宁")
.stream()
.allMatch(name -> name.startsWith("赵"));
System.out.println("matchResult = " + matchResult);
matchResult = Arrays.asList("张飞", "赵云", "吕布", "赵干", "马超", "甘宁")
.stream()
.allMatch(name -> name.length() == 2);
System.out.println("matchResult = " + matchResult);
matchResult = Arrays.asList("张飞", "赵云", "吕布", "赵干", "马超", "甘宁")
.stream()
.noneMatch(name -> name.startsWith("赵"));
System.out.println("matchResult = " + matchResult);
matchResult = Arrays.asList("张飞", "赵云", "吕布", "赵干", "马超", "甘宁")
.stream()
.noneMatch(name -> name.startsWith("趴"));
System.out.println("matchResult = " + matchResult);
⑦collect()
[1]方法声明
- 常用:<R, A> R collect(Collector<? super T, A, R> collector);
- 不常用:
<R> R collect(Supplier<R> supplier,
BiConsumer<R, ? super T> accumulator,
BiConsumer<R, R> combiner);
[2]用法
给collect()方法传入下列不同对象参数,可以有不同效果:
参数 | 作用 |
Collectors.toList() | 把流中的数据转换为List |
Collectors.toSet() | 把流中的数据转换为Set |
Collectors.toMap(name -> name, value -> value) | 把流中的数据转换为Map<br>我们需要通过函数型接口提供键和值 |
Collectors.groupingBy(name -> name.substring(0, 1)) | 根据指定规则对集合数据分组 |