什么是 Stream API?
Stream API 是 Java 8 中引入的一项新特性,它提供了一种函数式的、流式处理集合数据的方式。Stream API 可以让我们以更简洁、更易读的方式处理集合数据,同时还可以充分利用多核 CPU 的并行处理能力,提高程序的执行效率。
在 Stream API 中,我们可以通过一系列的操作对集合数据进行处理,这些操作可以分为中间操作和终止操作。中间操作是对流的数据进行处理和转换,但不会产生最终的结果;终止操作是产生最终结果的操作,它会触发流的处理,并将结果返回。
Stream API 主要包含以下几个部分:
- 流的创建:通过集合、数组、文件等方式创建流。
- 操作流:对流进行过滤、映射、排序、去重等操作。
- 终止流:将流转换为集合、数组、汇总统计、匹配检查等。
下面我们将详细介绍 Java 中如何使用 Stream API。
Java 中如何使用 Stream API?
流的创建
在 Java 中,我们可以通过多种方式创建流。以下是一些常用的流的创建方式:
从集合创建流
List<String> list = Arrays.asList("a", "b", "c", "d"); Stream<String> stream = list.stream();
从数组创建流
int[] array = {1, 2, 3, 4, 5}; IntStream stream = Arrays.stream(array);
从文件创建流
Path path = Paths.get("file.txt"); Stream<String> stream = Files.lines(path);
从函数创建流
Stream.generate(() -> "hello") .limit(5) .forEach(System.out::println);
在上面的代码中,我们使用 Stream.generate() 方法创建了一个无限流,该流会不断生成字符串 “hello”,然后使用 limit() 方法对流进行截取,最终输出前 5 个元素。
操作流
在创建了流之后,我们可以对流进行一系列的操作,以实现数据的处理和转换。以下是一些常用的流操作:
filter() 方法
filter() 方法可以对流中的数据进行过滤,只保留符合条件的数据,从而得到一个新的流。
List<String> list = Arrays.asList("a", "b", "c", "d"); Stream<String> stream = list.stream().filter(s -> s.startsWith("a"));
上面的代码中,我们使用 filter() 方法过滤出以 “a” 开头的字符串,得到一个新的流。
map() 方法
map() 方法可以对流中的数据进行转换,从而得到一个新的流。
List<String> list = Arrays.asList("a", "b", "c", "d"); Stream<String> stream = list.stream().map(String::toUpperCase);
上面的代码中,我们使用 map() 方法将字符串转换成大写形式,得到一个新的流。
sorted() 方法
sorted() 方法可以对流中的数据进行排序,从而得到一个新的流。
List<String> list = Arrays.asList("b", "a", "d", "c"); Stream<String> stream = list.stream().sorted();
上面的代码中,我们使用 sorted() 方法对字符串进行排序,得到一个新的流。
distinct() 方法
distinct() 方法可以对流中的数据进行去重,从而得到一个新的流。
List<String> list = Arrays.asList("a", "b", "a", "c"); Stream<String> stream = list.stream().distinct();
上面的代码中,我们使用 distinct() 方法对字符串进行去重,得到一个新的流。
peek() 方法
peek() 方法可以对流中的数据进行操作,不会改变流中的数据,但可以在操作过程中输出一些信息。
List<String> list = Arrays.asList("a", "b", "c", "d"); Stream<String> stream = list.stream().peek(System.out::println);
上面的代码中,我们使用 peek() 方法对字符串进行操作,并输出字符串的值,但不会改变流中的数据。
终止流
在对流进行了操作之后,我们可以通过终止操作将流转换为最终的结果。以下是一些常用的终止操作:
collect() 方法
collect() 方法可以将流中的元素收集到一个集合中,如 List、Set、Map 等。
List<String> list = Arrays.asList("a", "b", "c", "d"); List<String> result = list.stream().collect(Collectors.toList());
上面的代码中,我们使用 collect() 方法将流中的元素收集到一个 List 中。
reduce() 方法
reduce() 方法可以对流中的元素进行累加、求和等操作,得到一个最终的结果。
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5); int sum = list.stream().reduce(0, Integer::sum);
上面的代码中,我们使用 reduce() 方法对整数进行求和操作,并得到最终的结果。
count() 方法
count() 方法可以统计流中的元素个数。
List<String> list = Arrays.asList("a", "b", "c", "d"); long count = list.stream().count();
上面的代码中,我们使用 count() 方法统计了流中的元素个数。
forEach() 方法
forEach() 方法可以对流中的每个元素进行操作,如输出到控制台等。
List<String> list = Arrays.asList("a", "b", "c", "d"); list.stream().forEach(System.out::println);
上面的代码中,我们使用 forEach() 方法输出了流中的每个元素。
完整示例代码
下面是一个完整的示例代码,演示了如何使用 Stream API 对集合中的数据进行操作。
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class StreamDemo { public static void main(String[] args) { List<String> list = Arrays.asList("hello", "world", "java", "stream", "api"); // 过滤出长度大于 4 的字符串,并将其转换成大写形式 List<String> result = list.stream() .filter(s -> s.length() > 4) .map(String::toUpperCase) .collect(Collectors.toList()); System.out.println(result); // 统计字符串的个数 long count = list.stream().count(); System.out.println(count); // 对字符串进行排序,并输出到控制台 list.stream().sorted().forEach(System.out::println); // 对字符串进行去重,并输出到控制台 list.stream().distinct().forEach(System.out::println); // 对字符串进行操作,并输出到控制台 list.stream().peek(System.out::println).collect(Collectors.toList()); } }
以上代码演示了如何使用 Stream API 对集合中的数据进行操作,并输出结果到控制台。
总结
Stream API 是 Java 8 中引入的一项新特性,它提供了一种函数式的、流式处理集合数据的方式。Stream API 可以让我们以更简洁、更易读的方式处理集合数据,同时还可以充分利用多核 CPU 的并行处理能力,提高程序的执行效率。在使用 Stream API 时,我们可以通过一系列的操作对集合数据进行处理,这些操作可以分为中间操作和终止操作。中间操作是对流的数据进行处理和转换,但不会产生最终的结果;终止操作是产生最终结果的操作,它会触发流的处理,并将结果返回。通过使用 Stream API,我们可以更方便地进行集合数据的处理和转换,提高程序的可读性和可维护性。