Java 8 引入了 Stream API,使得对集合的操作变得更加简洁和高效。Stream 提供了一系列用于处理集合的常用方法,本文将详细介绍这些方法的使用,并通过代码示例进行演示。
1. 创建 Stream
你可以通过多种方式创建 Stream,最常见的是通过集合(如 List、Set)和数组。
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class StreamExample {
public static void main(String[] args) {
// 从集合创建 Stream
List<String> list = Arrays.asList("a", "b", "c", "d");
Stream<String> streamFromList = list.stream();
// 从数组创建 Stream
String[] array = new String[]{"e", "f", "g"};
Stream<String> streamFromArray = Arrays.stream(array);
}
}
2. 常用方法
2.1. filter()
filter()
方法用于过滤 Stream 中的元素,返回满足条件的元素。
List<String> filteredList = list.stream()
.filter(s -> s.equals("b"))
.collect(Collectors.toList());
System.out.println(filteredList); // 输出: [b]
2.2. map()
map()
方法用于对 Stream 中的每个元素进行处理,返回一个新的 Stream。
List<String> upperList = list.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
System.out.println(upperList); // 输出: [A, B, C, D]
2.3. flatMap()
flatMap()
方法用于将每个元素映射为多个元素,并合并成一个 Stream。
List<List<String>> listOfLists = Arrays.asList(
Arrays.asList("a", "b"),
Arrays.asList("c", "d")
);
List<String> flatMappedList = listOfLists.stream()
.flatMap(List::stream)
.collect(Collectors.toList());
System.out.println(flatMappedList); // 输出: [a, b, c, d]
2.4. distinct()
distinct()
方法用于去除 Stream 中的重复元素。
List<String> distinctList = Arrays.asList("a", "b", "b", "c", "c").stream()
.distinct()
.collect(Collectors.toList());
System.out.println(distinctList); // 输出: [a, b, c]
2.5. sorted()
sorted()
方法用于对 Stream 中的元素进行排序。
List<String> sortedList = list.stream()
.sorted()
.collect(Collectors.toList());
System.out.println(sortedList); // 输出: [a, b, c, d]
2.6. limit()
和 skip()
limit(n)
用于获取 Stream 中前 n 个元素,skip(n)
用于跳过前 n 个元素。
List<String> limitedList = list.stream()
.limit(2)
.collect(Collectors.toList());
System.out.println(limitedList); // 输出: [a, b]
List<String> skippedList = list.stream()
.skip(2)
.collect(Collectors.toList());
System.out.println(skippedList); // 输出: [c, d]
2.7. reduce()
reduce()
方法用于将 Stream 中的元素组合成一个单一的结果。
Optional<String> concatenated = list.stream()
.reduce((s1, s2) -> s1 + s2);
concatenated.ifPresent(System.out::println); // 输出: abcd
3. 终止操作
Stream 的操作通常分为两类:中间操作和终止操作。中间操作返回一个新的 Stream,而终止操作则会返回一个最终的结果,比如 collect()
、forEach()
和 count()
。
long count = list.stream().count();
System.out.println(count); // 输出: 4
list.stream().forEach(System.out::println); // 输出: a b c d
总结
Java Stream API 提供了强大而灵活的方法来处理集合,使代码更加简洁易读。通过使用 filter()
、map()
、flatMap()
、distinct()
、sorted()
等方法,开发者可以用非常简洁的方式进行复杂的数据操作。在实际开发中,合理使用 Stream,可以显著提高代码的可维护性和执行效率。