Stream提供的常用操作有

本文深入探讨了函数式编程中的转换、合并、并行处理及聚合等操作,包括map、filter、sorted、concat、reduce等实用函数的使用场景与技巧。

转换操作:map(), filter(), sorted(), distinct();

合并操作:concat(), flatMap();

并行处理:parallel();

聚合操作:reduce(), collect(), count(), max(), min(), sum(), average();

其他操作:allMatch(), anyMatch(), forEach()。

 

### Java Stream API 常用方法总结 Java Stream API 提供了许多强大的中间操作和终端操作方法,可以极大地简化集合数据的处理过程。以下是对其常用方法的分类总结。 #### 1. 创建 Stream 创建 Stream 的方式多种多样,主要包括从集合、数组或其他源生成流。 - **from Collection**: 使用 `Collection.stream()` 和 `Collection.parallelStream()` 方法分别生成串行流和并行流[^2]。 - **from Array**: 利用 `Arrays.stream(array)` 将数组转化为流。 - **static factory methods**: 调用 `Stream.of(elements...)` 或其他静态工厂方法直接生成流。 ```java List<String> list = Arrays.asList("a", "b", "c"); Stream<String> streamFromList = list.stream(); int[] array = {1, 2, 3}; IntStream streamFromArray = Arrays.stream(array); Stream<Integer> streamOfNumbers = Stream.of(1, 2, 3); ``` --- #### 2. 中间操作 (Intermediate Operations) 中间操作不会立即执行,而是形成一个新的 Stream 对象,只有在触发终端操作时才会真正运行。 ##### 过滤与切片 - **filter(Predicate p)**: 根据给定条件筛选元素[^3]。 - **limit(long maxSize)**: 截断流使其最多包含指定数量的元素。 - **skip(long n)**: 跳过前 n 个元素(如果流中有更多元素)。 ```java Stream<String> filteredStream = stream.filter(s -> s.length() > 3); // 筛选长度大于3的字符串 Stream<String> limitedStream = stream.limit(5); // 获取前5个元素 Stream<String> skippedStream = stream.skip(2); // 跳过前两个元素 ``` ##### 映射与扁平化 - **map(Function f)**: 将每个输入元素应用到函数上,并返回结果作为新流的一部分。 - **flatMap(Function f)**: 类似 map,但会将结果进一步展开成单层流。 ```java Stream<Integer> mappedStream = stream.map(String::length); // 计算字符串长度 Stream<String> flatMappedStream = stream.flatMap(s -> Arrays.stream(s.split(","))); // 展开逗号分隔的内容 ``` ##### 排序 - **sorted() / sorted(Comparator c)**: 自然顺序或自定义顺序排序。 ```java Stream<String> sortedNaturalOrder = stream.sorted(); // 默认按字典序排列 Stream<String> customSortedStream = stream.sorted((a, b) -> b.compareTo(a)); // 自定义降序排列 ``` --- #### 3. 终端操作 (Terminal Operations) 终端操作会触发整个流水线的实际计算,并通常会产生某种结果或副作用。 ##### 收集结果 - **collect(Collector c)**: 将流中的元素收集到特定容器中,如 List、Set 或 Map。 - **toArray()**: 返回一个包含所有元素的数组。 ```java List<String> resultList = stream.collect(Collectors.toList()); // 收集成列表 String[] resultArray = stream.toArray(String[]::new); // 转换为数组 ``` ##### 查找与匹配 - **findAny() / findFirst()**: 随机或有序查找第一个满足条件的元素。 - **anyMatch(Predicate p) / allMatch(Predicate p) / noneMatch(Predicate p)**: 测试是否有任意/全部/无任何元素满足某个条件。 ```java Optional<String> anyElement = stream.findAny(); // 找到任一元素 boolean hasEvenLength = stream.anyMatch(s -> s.length() % 2 == 0); // 至少有一个偶数长度字符串 ``` ##### 归约与汇总统计 - **reduce(BinaryOperator accumulator)**: 应用累积运算得到单一结果。 - **summaryStatistics()**: 自动生成描述性统计数据对象。 ```java Integer sum = stream.mapToInt(Integer::intValue).sum(); // 求和 Double average = stream.mapToDouble(Double::doubleValue).average().orElse(0.0); // 求平均值 ``` --- #### 4. 并行流 (Parallel Streams) 通过调用 `parallelStream()` 方法启用并行处理能力,适合大规模数据集上的高性能需求场景[^1]。 ```java list.parallelStream() .forEach(System.out::println); // 并行打印元素 ``` --- ### 总结 以上列举了 Java Stream API 的核心功能模块及其典型用途。合理运用这些方法可以使程序更具有表达力且易于维护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值