在Java中如何使用Stream进行筛选与过滤操作
发布时间: 2023-12-21 01:27:45 阅读量: 45 订阅数: 43
# 1. Java Stream简介
## 1.1 什么是Java Stream
Java Stream是Java 8中引入的一个新的API,它提供了一种流式处理数据的方式。Stream可以用于处理集合、数组等数据源,提供了丰富的操作方法,可以灵活地进行筛选、过滤、转换、排序等操作。
## 1.2 为什么要使用Stream
使用传统的集合操作方式,需要显式地进行迭代、条件判断、临时变量的创建等,而Stream可以通过链式调用的方式,简洁地表达对数据的处理逻辑。Stream还支持并行处理,能够充分利用多核处理器的优势,提高程序的执行效率。
## 1.3 Stream的基本特性
- Stream不储存数据,它只是提供了对数据源进行操作的方式。
- Stream的操作可以是中间操作,也可以是终止操作。中间操作返回一个新的Stream,而终止操作返回一个结果。
- Stream的操作可以是无状态的,也可以是有状态的。无状态的操作不依赖于之前的操作结果,可以独立处理每个元素;有状态的操作则需要依赖之前的操作结果。
以上是Java Stream的简介内容,接下来将进一步介绍Stream的创建与操作。
# 2. Stream的创建与初步操作
在Java中,我们可以使用Stream来进行各种强大的数据操作,包括筛选、过滤、转换、分组、排序等。在开始介绍Stream的各种用法之前,我们先来了解一下如何创建和使用Stream。
#### 2.1 Stream的创建方式
在Java中,我们可以通过多种方式来创建Stream,包括集合、数组、I/O通道、生成器等。下面介绍几种常见的创建方式:
- **通过集合创建Stream:**
```java
List<String> list = Arrays.asList("apple", "banana", "orange");
Stream<String> stream = list.stream();
```
- **通过数组创建Stream:**
```java
String[] array = {"apple", "banana", "orange"};
Stream<String> stream = Arrays.stream(array);
```
- **通过Stream的of方法创建Stream:**
```java
Stream<String> stream = Stream.of("apple", "banana", "orange");
```
- **通过Stream的generate方法创建Stream:**
```java
Stream<String> stream = Stream.generate(() -> "apple").limit(5);
```
- **通过Stream的iterate方法创建Stream:**
```java
Stream<Integer> stream = Stream.iterate(0, n -> n + 2).limit(5);
```
#### 2.2 Stream的中间操作
在创建Stream之后,我们可以对其进行一系列的中间操作,来对数据进行处理和转换。下面是一些常见的中间操作示例:
- **Filter操作符:** 用于筛选符合条件的元素。
```java
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> evenNumbers = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
```
- **Map操作符:** 用于对流中的每个元素进行映射处理。
```java
List<String> words = Arrays.asList("apple", "banana", "orange");
List<Integer> wordLengths = words.stream()
.map(String::length)
.collect(Collectors.toList());
```
- **Distinct操作符:** 用于去重。
```java
List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 3, 3, 4, 5);
List<Integer> distinctNumbers = numbers.stream()
.distinct()
.collect(Collectors.toList());
```
- **Limit操作符:** 用于限制流的元素数量。
```java
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> limitedNumbers = numbers.stream()
.limit(3)
.collect(Collectors.toList());
```
- **Skip操作符:** 用于跳过指定数量的元素。
```java
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> skippedNumbers = numbers.stream()
.skip(2)
.collect(Collectors.toList());
```
#### 2.3 Stream的终止操作
除了中间操作之外,我们还需要进行终止操作来获取最终的结果。常见的终止操作包括收集结果、聚合操作、判断操作等。
- **Collect操作符:** 用于将流中的元素收集到一个集合中。
```java
List<String> words = Arrays.asList("apple", "banana", "orange");
List<String> collectedWords = words.stream()
.collect(Collectors.toList());
```
- **Reduce操作符:** 用于将流中的元素逐个进行计算,并返回最终结果。
```java
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> sum = numbers.stream()
.reduce((a, b) -> a + b);
```
- **Match操作符:** 用于判断流中的元素是否满足指定条件。
```java
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
boolean anyMatch = numbers.stream()
.anyMatch(n -> n % 2 == 0);
```
- **ForEach操作符:** 用于对流中的每个元素进行操作。
```java
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.stream()
.forEach(System.out::println);
``
```
0
0