十四、Stream流
Stream流的作用
结合Lambda表达式,简化集合、数组的操作。
Stream流的使用步骤
- 先得到一条Stream流,并把数据放上去。
- 利用Stream流中的API进行各种操作。
- 中间方法:调用完毕之后,还可以调用其他方法。(过滤、转换)
- 终结方法:最后一步,调用完毕之后,不能调用其他方法。(统计、打印)
获取Stream流方式
获取方式 | 方法名 | 说明 |
---|---|---|
单列集合 | default Stream< E > stream() | Collection类中的默认方法 |
双列集合 | 无 | 无法直接使用Stream流 |
数组 | public static < T > Stream< T > stream(T[] array) | Arrays工具类中的静态方法 |
一堆零散数据 | public static < T > Stream< T > stream(T…values) | Stream接口中的静态方法 |
//1.单列集合获取Stream流
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "a", "b", "c", "d", "e");
//获取一条流水线,并把集合中的数据放到流水线上
Stream<String> stream1 = list.stream();
//使用终结方法打印流水线上所有数据
stream1.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
//s表示流水线上的每一个数据
System.out.println(s);
}
});
//链式编程结合Lambda表达式
//list.stream().forEach(s -> System.out.println(s));
//1.创建双列集合
HashMap<String, Integer> hm = new HashMap<>();
//2.添加数据
hm.put("aaa",111);
hm.put("bbb",222);
hm.put("ccc",333);
hm.put("ddd",444);
//3.第一种方法获取Stream流
hm.keySet().stream().forEach(s -> System.out.println(s));
//4.第二种方法获取Stream流
hm.entrySet().stream().forEach(s -> System.out.println(s))
//1.创建数据
int[] arr = {1,2,3,4,5,6,7,8,9,10};
//2.获取stream流
Arrays.strem(arr).forEach(s -> System.out.println(s));
//零散数据
//方法形参是一个可变参数,可以传递一堆零散的数据,也可以传递数组
//但是数组必须是引用数据类型的,如果传递基本数据类型,是会把整个数组当作一个元素放入stream中。
stream.of(1,2,3,4,5).forEach(s -> System.out.println(s));
Stream流的中间方法
名称 | 说明 |
---|---|
Stream< T > filter(Predicate<? super T> predicate) | 过滤 |
Stream< T > limit(long maxSize) | 获取前几个元素 |
Stream< T > skip(long n) | 跳过前几个元素 |
Stream< T > distinct() | 元素去重,依赖(HashCode()和equals方法) |
static< T >Stream< T > concat(Stream a, Stream b) | 合并a和b两个流为一个流 |
Stream< R > map(Function<T, R> mapper) | 转换流中的数据类型 |
注意点:
- 中间方法,返回新的stream流,原来的stream流只能用一次,建议使用链式编程。
- 修改stream流中的数据,不会影响原来集合或者数组中的数据。
Stream流的终结方法
名称 | 说明 |
---|---|
void forEach(Consumer action) | 遍历 |
long count() | 统计 |
toArray() | 收集流中的数据,放到数组中 |
collect(Collector collector) | 收集流中的数据,放到集合中 |