Java中如何使用StreamAPI处理集合和数组?
StreamAPI 是 Java8 中非常强大的功能之一,它不仅可以让集合和数组变得更加简单和易用,而且还可以提高代码的可读性和处理效率。本文将会介绍 Java 中如何使用 StreamAPI 处理集合和数组。
一、什么是 StreamAPI
StreamAPI 是 Java8 中新加入的 API,它可以让我们以一种函数式的风格处理集合和数组中的元素。
StreamAPI 的核心思想就是将数据抽象成流,我们可以通过链式调用、lambda表达式等方式对流中的数据进行过滤、排序、映射、分组、计算等操作,最终得到想要的结果。
与传统的迭代器相比,StreamAPI 更加容易编写和理解,而且还可以自动化地处理并发和延迟问题,这些都可以让我们提高代码的可读性和处理效率。因此,StreamAPI 已经成为了 Java 编程中不可或缺的一部分。
二、StreamAPI的基本使用
1.创建流
Java 中的 StreamAPI 可以处理集合和数组,我们可以通过以下方式来创建流:
(1)通过集合创建流
List<String> list = new ArrayList<>(); Stream<String> stream = list.stream();
(2)通过数组创建流
int[] array = new int[] {1, 2, 3, 4, 5};
IntStream stream = Arrays.stream(array);
2.流的操作
流的操作分为两种,一种是中间操作,一种是终止操作。中间操作可以对流进行过滤、转换等操作,但并不会触发流的计算。终止操作则会执行所有的中间操作,并返回一个结果或 side-effect。
(1)中间操作
中间操作包括 filter、map、flatMap、distinct、sorted、peek、limit、skip、concat 等。
List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
list.stream()
.filter(x -> x % 2 == 0) //过滤偶数
.map(x -> x * x) //映射成平方数
.limit(3) //只取前三个
.forEach(System.out::println); //输出结果
//4 16 36
(2)终止操作
终止操作可以返回流的计算结果或 side-effect。如 count、sum、min、max、reduce、collect 等。
List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
long count = list.stream()
.filter(x -> x % 2 == 0) //过滤偶数
.count();
System.out.println(count); //5
三、StreamAPI的应用实例
下面我们来看一个实际的例子,如何使用 StreamAPI 来统计一篇文章中每个单词出现的次数。
首先我们读取文章,使用 Regex 将其分割成单词列表:
String text = readFileToString(new File("article.txt"));
List<String> words = Arrays.asList(text.split("\\W+"));
然后我们将单词列表转换成 Stream:
Stream<String> stream = words.stream();
接着,我们开始对流进行中间操作,将单词转换成小写:
Stream<String> lowercaseWords = stream.map(String::toLowerCase);
接着,我们过滤掉空字符串:
Stream<String> nonEmptyWords = lowercaseWords.filter(s -> !s.isEmpty());
然后,我们通过 Collectors 取出每个单词并统计其出现次数:
Map<String, Long> wordCounts = nonEmptyWords.collect(
Collectors.groupingBy(
Function.identity(),
Collectors.counting()
)
);
最后,我们循环输出每个单词和其出现次数:
wordCounts.forEach((word, count) ->
System.out.printf("Word %s appears %d times
", word, count));
完整代码如下:
public static void main(String[] args) throws IOException {
String text = readFileToString(new File("article.txt"));
List<String> words = Arrays.asList(text.split("\\W+"));
Stream<String> stream = words.stream();
Stream<String> lowercaseWords = stream.map(String::toLowerCase);
Stream<String> nonEmptyWords = lowercaseWords.filter(s -> !s.isEmpty());
Map<String, Long> wordCounts = nonEmptyWords.collect(
Collectors.groupingBy(
Function.identity(),
Collectors.counting()
)
);
wordCounts.forEach((word, count) ->
System.out.printf("Word %s appears %d times
", word, count));
}
public static String readFileToString(File file) throws IOException {
try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
StringBuilder sb = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
sb.append(line).append("
");
}
return sb.toString();
}
}
运行结果:
Word 2 appears 1 times Word efficient appears 1 times Word Because appears 1 times Word 4 appears 1 times Word processing appears 3 times Word increase appears 1 times Word correct appears 1 times Word algorithms appears 1 times Word 1 appears 1 times Word simple appears 1 times Word size appears 1 times Word no appears 1 times Word uses appears 1 times Word 3 appears 1 times Word resources appears 1 times Word programming appears 1 times Word time appears 1 times Word in appears 5 times Word accessible appears 1 times Word run appears 1 times Word efficiency appears 1 times Word available appears 1 times Word form appears 1 times Word adapt appears 1 times ...
四、总结
StreamAPI 是 Java8 中非常强大的功能之一,可以让我们以一种函数式的风格处理集合和数组中的元素。StreamAPI 的操作分为中间操作和终止操作,我们可以通过链式调用、lambda表达式等方式对流中的数据进行过滤、排序、映射、分组、计算等操作,最终得到想要的结果。本文介绍了 StreamAPI 的基本用法以及一个应用实例,在实际编程中,我们可以灵活运用 StreamAPI 来简化代码,并提高处理效率和可读性。
