使用方法总结
Java 8引入了Stream API,它提供了一种高效且易于使用的数据处理方式,特别适合集合对象的操作,如过滤、映射、排序等。
Stream API不仅可以提高代码的可读性和简洁性,还能利用多核处理器的优势进行并行处理。
本文介绍Arrays的stream流用法。
- 使用方法总结
- 对数组简单操作
- 最大值max
- 最小值min
- 平均值average
- 数组长度count
- 数组去重后长度distinct
- 数组排序sorted
- 对数组复杂操作
- 获得intStream对象
- 匹配allMatch
- 匹配anyMatch
- 过滤filter
- 限制数量limit
- 遍历操作收纳collect
- 获取第一个元素findFirst
- 跳过skip,枚举foreach
- 枚举map
对数组简单操作
创建一个数组
int[] nums = new int[]{1,4,8,11,6,3,5,10,1,0};
最大值max
int maxv = Arrays.stream(nums).max().getAsInt();
// 11
最小值min
int minv = Arrays.stream(nums).min().getAsInt();
// 0
平均值average
double avg = Arrays.stream(nums).average().getAsDouble();
// 5.0
数组长度count
long cnt = Arrays.stream(nums).count();
// 7
数组去重后长度distinct
int[] arr = Arrays.stream(nums).distinct().toArray();
System.out.println(Arrays.toString(arr));
// [1, 4, 8, 11, 10, 0]
数组排序sorted
int[] sortedArr = Arrays.stream(nums).sorted().toArray();
System.out.println(Arrays.toString(sortedArr));
// [0, 1, 1, 4, 8, 10, 11]
对数组复杂操作
获得intStream对象
IntStream intStream = (nums);
IntStream intStream = (1,4,8,11,10,1,0);
这个对象只能使用一次,重复使用会报错
Exception in thread "main" : stream has already been operated upon or closed
at /(:229)
这也说明Stream流是线程安全的
匹配allMatch
全部成立才返回true
boolean allMatch = intStream.allMatch(x -> x > 0);
// false
匹配anyMatch
一个成立就返回true
boolean anyMatch = intStream.anyMatch(x -> x == 10);
// true
过滤filter
对数组进行筛选
int[] arr5 = intStream.filter(x -> x >= 5).toArray();
// [8, 11, 10]
限制数量limit
int[] arrLim = intStream.limit(5).toArray();
// [1, 4, 8, 11, 10]
遍历操作收纳collect
collect()接收三个参数,分别是Supplier supplier,ObjIntConsumer accumulator,BiConsumer<R, R> combiner
三者的关系可以用遍历,操作,收纳来概括
R result = supplier.get();
for (int element : this stream)
accumulator.accept(result, element);
return result;
将数组nums中元素和对应字母以kv值的方式放到map中
HashMap<String, Integer> map = intStream.collect(HashMap<String, Integer>::new, (m, x) -> m.put(new String(new byte[]{(byte) ('A' + x)}), x), Map::putAll);
// {A=0, B=1, E=4, I=8, K=10, L=11}
把int[]转成List,如果是Integer[]转List直接asList()即可,但是int的话就不行,collect提供了一个转换的方法
ArrayList<Integer> list = intStream.collect(ArrayList<Integer>::new, List::add, List::addAll);
// [1, 4, 8, 11, 10, 1, 0]
获取第一个元素findFirst
int x = intStream.findFirst().getAsInt();
// 1
跳过skip,枚举foreach
注意foreach不支持提前退出操作
intStream.skip(5).forEach(System.out::println);
// 1
// 0
枚举map
map和foreach的区别是,map一般作为其他操作的前置操作,执行一些简单的逻辑
int[] arr = intStream.map(x -> x > 5 ? 1 : 0).toArray();
// [0, 0, 1, 1, 1, 0, 0]