使用方法总结

时间:2025-03-15 16:10:26

使用方法总结

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]