Java Stream流详解

Java Stream流详解


Java 8 引入了一个全新的 Stream API,该 API 可以让你以一种声明式的方式处理数据。Stream API 提供了一种高效且易于使用的数据处理机制,特别是它可以与 lambda 表达式一起使用,使得代码既简洁又易读。


1. 中间操作


Stream API 提供了多种中间操作,每个操作都会返回一个新的 Stream 对象,这些操作的结果可以链式调用。


1.1 Filter(过滤)


Filter 用于对 Stream 中的数据进行过滤,只保留满足条件的元素。


```java

stream.filter(e -> e.startsWith("a")).forEach(System.out::println);

```


1.2 Map(转换)


Map 用于将 Stream 中的元素转换为另一种形式的元素。


```java

stream.map(String::toUpperCase).forEach(System.out::println);

```


1.3 Sorted(排序)


Sorted 用于将 Stream 中的元素进行排序,可以自定义排序规则。


```java

stream.sorted().forEach(System.out::println);

```


1.4 Distinct(去重)


Distinct 用于去除 Stream 中的重复元素。


```java

stream.distinct().forEach(System.out::println);

```


1.5 Limit(限制)


Limit 用于获取 Stream 中的前 n 个元素。


```java

stream.limit(3).forEach(System.out::println);

```


1.6 Skip(跳过)


Skip 用于跳过 Stream 中的前 n 个元素。


```java

stream.skip(3).forEach(System.out::println);

```


1.7 Peek(展示)


Peek 用于展示每个元素,常用于调试。


```java

stream.peek(System.out::println).forEach(e -> {});

```


2. 终止操作


终止操作用于产生一个最终的结果或者副作用。


2.1 forEach(循环)


遍历 Stream 中的每个元素。


```java

stream.forEach(System.out::println);

```


2.2 Collect(收集)


将 Stream 中的元素收集到一个集合中。


```java

List<String> list = stream.collect(Collectors.toList());

```


 2.3 Count(计数)


计算 Stream 中的元素数量。


```java

long count = stream.count();

```


2.4 Reduce(聚合)


将 Stream 中的元素进行聚合。


```java

Optional<Integer> sum = stream.reduce(Integer::sum);

```


 2.5 AnyMatch(任意匹配)


判断 Stream 中是否有任意一个元素满足给定的条件。


```java

boolean anyMatch = stream.anyMatch(e -> e.startsWith("a"));

```


 2.6 AllMatch(全部匹配)


判断 Stream 中的所有元素是否都满足给定的条件。


```java

boolean allMatch = stream.allMatch(e -> e.startsWith("a"));

```


2.7 NoneMatch(无匹配)


判断 Stream 中的所有元素是否都不满足给定的条件。


```java

boolean noneMatch = stream


.noneMatch(e -> e.startsWith("a"));

```


3. 使用Stream流的优缺点


优点:


1. 代码简洁:使用 Stream API 可以让你的代码变得更加简洁,更易于阅读和维护。


2. 支持并行处理:Stream API 支持并行处理,可以很好地利用多核处理器的优势,大大提高代码的运行效率。


3. 延迟执行:Stream API 的许多操作都是延迟执行的,只有当需要结果的时候才会开始执行,这种方式可以减少不必要的计算。


 缺点:


1. 学习成本:对于初学者来说,Stream API 的学习成本相对较高。


2. 调试困难:由于 Stream 的链式操作和内部迭代的特性,调试 Stream 的代码可能会比较困难。


3. 无法复用:Stream 无法被复用,一旦被遍历或者调用终止操作,就会被关闭。


 4. 怎么用?


这里是一个简单的例子,使用 Stream API 来处理一组数据:


```java

List<String> list = Arrays.asList("apple", "banana", "cherry", "apple", "cherry");

list.stream()  // 创建 Stream

    .filter(s -> s.length() > 5)  // 过滤

    .map(String::toUpperCase)  // 转换

    .sorted()  // 排序

    .distinct()  // 去重

    .limit(3)  // 限制

    .skip(1)  // 跳过

    .forEach(System.out::println);  // 循环输出

```


邓棋文 2023-10-21