欢迎访问宙启技术站
智能推送

Java中如何使用StreamAPI处理集合和数组?

发布时间:2023-06-15 08:34:07

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 来简化代码,并提高处理效率和可读性。