Java 8 Stream API 入门教程:轻松使用 map、filter 和 collect 进行数据处理
流式处理是 Java 8 引入的一个强大功能,特别适用于集合的处理,它提供了更加简洁和声明式的方式来操作数据。流式处理(Stream API)使得开发者能够通过一系列的函数式操作来处理集合(如 List、Set 等)。其中,常用的操作包括 map
、filter
和 collect
。下面我们将介绍这三者的基本用法,并结合示例代码加以说明。
1. map
操作
map
是流中的一个中间操作,用于将流中的元素映射成另一个形式。它接收一个函数作为参数,这个函数将作用于流中的每个元素,返回一个新的元素。map
常用于转换元素的类型或对元素进行某种处理。
示例:将整数列表中的每个元素乘以 2
import java.util.*;
import java.util.stream.*;
public class StreamMapExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
// 使用 map 操作将每个元素乘以 2
List<Integer> doubledNumbers = numbers.stream()
.map(n -> n * 2)
.collect(Collectors.toList());
System.out.println(doubledNumbers); // 输出: [2, 4, 6, 8, 10]
}
}
2. filter
操作
import java.util.*;
import java.util.stream.*;
public class StreamFilterExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// 使用 filter 操作筛选出偶数
List<Integer> evenNumbers = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
System.out.println(evenNumbers); // 输出: [2, 4, 6, 8, 10]
}
}
filter
是流中的另一个中间操作,用于筛选符合条件的元素。它接收一个谓词(Predicate)作为参数,流中只有满足条件的元素会被保留下来。
示例:筛选出列表中的偶数
3. collect
操作
collect
是流的一个终端操作,用于将流的元素转化为其他形式,通常是集合。collect
操作非常常见,它可以将流的结果聚合成一个 List、Set、Map 等集合,或者进行其他的汇总操作(如求和、平均等)。
示例:将筛选后的偶数元素收集到一个 Set 中
import java.util.*;
import java.util.stream.*;
public class StreamCollectExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// 使用 filter 筛选偶数,并收集到 Set 中
Set<Integer> evenNumbersSet = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toSet());
System.out.println(evenNumbersSet); // 输出: [2, 4, 6, 8, 10]
}
}
综合示例:使用 map
、filter
和 collect
进行链式操作
流式处理的一个强大之处就是支持链式调用。你可以在一个流中同时使用 map
、filter
和 collect
等操作,将多个操作组合在一起,进行复杂的数据处理。
示例:将列表中的偶数元素加倍并收集到一个新的列表中
import java.util.*;
import java.util.stream.*;
public class StreamMapFilterCollectExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// 链式操作:筛选偶数并将其加倍,最后收集到列表中
List<Integer> result = numbers.stream()
.filter(n -> n % 2 == 0) // 筛选偶数
.map(n -> n * 2) // 将偶数加倍
.collect(Collectors.toList()); // 收集到列表
System.out.println(result); // 输出: [4, 8, 12, 16, 20]
}
}
总结
map
用于转换流中的每个元素,返回处理后的新元素。filter
用于筛选流中符合条件的元素,返回符合条件的元素。collect
用于将流处理的结果收集到集合中。
流式处理通过这些基本操作,可以以更简洁和声明的方式对集合数据进行处理,避免了显式的循环和条件判断,使代码更加易于理解和维护。