Stream的概念与操作:高效的数据处理方式!

举报
喵手 发表于 2025/06/09 17:51:27 2025/06/09
170 0 0
【摘要】 开篇语哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,...

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前序

在Java 8中,引入了Stream API,旨在以声明式的方式简化数据处理。Stream使得处理集合数据变得更加简洁、高效、可读性更强,并支持函数式编程风格。通过Stream,我们可以轻松地进行过滤、排序、映射、聚合等常见的集合操作,并且支持并行计算,提高程序的执行效率。

今天,我们将深入探讨Stream的概念、基本操作以及如何高效地使用Stream API处理数据。

前言

随着Java 8引入的Stream API,处理集合数据不再需要写繁琐的迭代代码,Stream通过管道化的方式(Pipeline)允许你以声明性方式操作数据。这种方式不仅简化了代码,还使得程序在处理大量数据时能更高效地进行操作(尤其是并行处理)。我们将通过实例来展示如何使用Stream进行常见的集合操作,如过滤、映射、排序、聚合等。

第一部分:Stream的基本概念

1.1 什么是Stream?

Stream 是对集合的抽象,它代表了一种可以按需执行的元素序列(例如集合、数组等)。Stream API提供了一种高效的方式来处理数据,可以将数据操作链式连接,简化代码的复杂度。

Stream并不存储数据,它仅仅是描述数据操作的过程。因此,Stream操作分为两种类型:

  • 中间操作(Intermediate Operations):这些操作返回一个Stream本身,允许链式调用。常见的中间操作包括filtermapdistinctsorted等。
  • 终止操作(Terminal Operations):这些操作会产生一个结果,或者对Stream进行遍历,或者将其收集到集合中。常见的终止操作包括forEachcollectreduce等。

1.2 Stream的特点

  • 惰性计算(Lazy Evaluation):Stream的操作是惰性计算的,这意味着Stream的中间操作在调用终止操作之前不会被执行。这使得Stream能够优化计算(例如惰性加载、短路等)。
  • 无状态操作:Stream的中间操作不改变源数据结构,只是对数据的视图进行操作。
  • 可以并行处理:Stream支持并行流(parallelStream()),这允许我们利用多核CPU并行处理数据,提高性能。

第二部分:常见的Stream操作

2.1 创建Stream

Stream可以从多种数据源创建,例如集合、数组等。

从集合创建Stream

import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class StreamExample {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("Apple", "Banana", "Cherry", "Date");

        // 使用Stream.of()直接创建Stream
        Stream<String> stream1 = Stream.of("Apple", "Banana", "Cherry", "Date");

        // 使用集合的stream()方法创建Stream
        Stream<String> stream2 = list.stream();

        stream2.forEach(System.out::println);
    }
}

从数组创建Stream

public class StreamExample {
    public static void main(String[] args) {
        String[] array = {"Apple", "Banana", "Cherry", "Date"};

        // 使用Arrays.stream()方法创建Stream
        Stream<String> stream = Arrays.stream(array);

        stream.forEach(System.out::println);
    }
}

2.2 中间操作:filter()map()distinct()sorted()

2.2.1 filter():过滤操作

filter()中间操作用于筛选符合特定条件的元素。

示例:

import java.util.Arrays;
import java.util.List;

public class StreamExample {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("Apple", "Banana", "Cherry", "Date");

        // 过滤出长度大于5的水果名
        list.stream()
            .filter(fruit -> fruit.length() > 5)
            .forEach(System.out::println);  // 输出:Banana, Cherry
    }
}

2.2.2 map():映射操作

map()中间操作用于将Stream中的每个元素映射成一个新元素,通常用于转换数据类型或内容。

示例:

import java.util.Arrays;
import java.util.List;

public class StreamExample {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("apple", "banana", "cherry");

        // 将所有水果名转换为大写
        list.stream()
            .map(String::toUpperCase)
            .forEach(System.out::println);  // 输出:APPLE, BANANA, CHERRY
    }
}

2.2.3 distinct():去重操作

distinct()中间操作用于去除Stream中的重复元素。

示例:

import java.util.Arrays;
import java.util.List;

public class StreamExample {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("apple", "banana", "apple", "cherry");

        // 去重
        list.stream()
            .distinct()
            .forEach(System.out::println);  // 输出:apple, banana, cherry
    }
}

2.2.4 sorted():排序操作

sorted()中间操作用于对Stream中的元素进行排序。它默认按照元素的自然顺序进行排序。

示例:

import java.util.Arrays;
import java.util.List;

public class StreamExample {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("apple", "banana", "cherry", "date");

        // 排序
        list.stream()
            .sorted()
            .forEach(System.out::println);  // 输出:apple, banana, cherry, date
    }
}

如果需要自定义排序规则,可以使用sorted(Comparator)


2.3 终止操作:forEach()collect()reduce()

2.3.1 forEach():遍历操作

forEach()终止操作用于遍历Stream中的每个元素,并对其执行某些操作。

示例:

import java.util.Arrays;
import java.util.List;

public class StreamExample {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("apple", "banana", "cherry");

        // 遍历并打印每个元素
        list.stream()
            .forEach(System.out::println);  // 输出:apple, banana, cherry
    }
}

2.3.2 collect():收集操作

collect()终止操作用于将Stream的元素收集到一个集合中,最常用的是收集到ListSetMap等。

示例:

import java.util.*;
import java.util.stream.Collectors;

public class StreamExample {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("apple", "banana", "cherry");

        // 将Stream的元素收集到一个List中
        List<String> result = list.stream()
            .map(String::toUpperCase)
            .collect(Collectors.toList());

        System.out.println(result);  // 输出:[APPLE, BANANA, CHERRY]
    }
}

2.3.3 reduce():归约操作

reduce()终止操作用于将Stream中的元素反复结合起来,最终得到一个值。它通常用于求和、求最小值、最大值等操作。

示例:

import java.util.Arrays;
import java.util.List;

public class StreamExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

        // 求和
        int sum = numbers.stream()
            .reduce(0, (a, b) -> a + b);

        System.out.println("Sum: " + sum);  // 输出:Sum: 15
    }
}

解释:

  • reduce(0, (a, b) -> a + b):初始值为0,将Stream中的元素依次相加。

第三部分:并行流(Parallel Stream)

3.1 什么是并行流?

并行流(Parallel Stream)是Stream的一种扩展,允许在多个线程中并行地处理数据,利用多核CPU提高计算效率。

3.2 创建并行流

可以通过parallelStream()方法将Stream转为并行流。

示例:

import java.util.Arrays;
import java.util.List;

public class ParallelStreamExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

        // 使用并行流处理数据
        numbers.parallelStream()
            .forEach(System.out::println);
    }
}

解释:

  • parallelStream()方法会将数据并行处理,从而加速计算过程。

3.3 并行流的优势与劣势

  • 优势:利用多核CPU加速数据处理,适合处理大量数据。
  • 劣势:在某些场景下,并行流可能会比串行流更慢,尤其是数据量较小或操作复杂时,线程切换的开销可能影响性能。

总结

Java的Stream API为我们提供了一种简洁而高效的数据处理方式。通过Stream,我们能够以声明式的方式进行过滤、映射、排序、聚合等操作,同时支持并行处理,极大地提高了代码的简洁性和运行效率。

通过掌握Stream的概念与常见操作,我们可以高效地处理集合数据,提高程序的性能和可维护性。希望你在实际开发中,能够灵活运用Stream,编写更加优雅和高效的Java代码。

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。


版权声明:本文由作者原创,转载请注明出处,谢谢支持!

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。