Java [ 基础 ] Stream流 ✨

✨探索Java基础Stream流✨

        在现代Java编程中,Stream是一个非常强大的工具,它提供了一种更高效和简洁的方式来处理集合数据。在这篇博客中,我们将深入探讨Java中的Stream流,介绍它的基础知识、常见操作和一些实用示例。

什么是Stream?

   StreamJava 8引入的一部分,它是一种用于处理数据序列的抽象。Stream允许我们以声明性的方式处理数据,而不是通过编写大量的迭代代码。简而言之,Stream提供了一种简洁而功能强大的数据处理方式。

Stream的特点

  • 不存储数据:Stream本身不存储数据,它们从集合或数组等数据源中获取数据。
  • 不可变性:对Stream的操作不会修改源数据,而是会生成一个新的Stream。
  • 惰性执行:很多Stream操作是惰性执行的,只有在需要结果时才会实际进行计算。

如何创建Stream

有多种方法可以创建Stream,最常见的是从集合或数组中创建。

从集合创建

List<String> myList = Arrays.asList("apple", "banana", "orange", "watermelon");
// 从集合创建Stream
Stream<String> myStream = myList.stream();

从数组创建

String[] myArray = {"apple", "banana", "orange", "watermelon"};
// 从数组创建Stream
Stream<String> myStream = Arrays.stream(myArray);

使用Stream静态方法

// 使用Stream.of方法创建Stream
Stream<String> myStream = Stream.of("apple", "banana", "orange", "watermelon");

常见的Stream操作

Stream操作可以分为两类:中间操作最终操作

例如:

中间操作

中间操作返回一个新的Stream,它们是惰性执行的。这意味着这些操作不会立即执行,而是会在终端操作调用时执行。

  • filter:过滤数据
  • map:将数据转换为另一种形式
  • flatMap:将多个Stream合并为一个Stream
  • distinct:去重
  • sorted:排序

List<String> myList = Arrays.asList("apple", "banana", "orange", "watermelon", "apple");
// 使用中间操作过滤、映射、去重和排序
Stream<String> myStream = myList.stream()
               .filter(s -> s.startsWith("a")) // 过滤以"a"开头的元素
               .map(String::toUpperCase)       // 将元素转换为大写
               .distinct()                     // 去重
               .sorted();                      // 排序

终端操作

终端操作会触发Stream的实际计算,并返回一个结果或副作用。

  • forEach:对每个元素执行操作
  • collect:将Stream转换为集合
  • count:计算元素数量
  • reduce:聚合元素
  • findFirst:返回第一个元素

// 创建一个包含字符串的列表
List<String> myList = Arrays.asList("apple", "banana", "orange", "watermelon", "apple");

// 计算以"a"开头的不同元素数量
long count = myList.stream() // 将列表转换为流
                   .filter(s -> s.startsWith("a")) // 过滤以"a"开头的元素
                   .distinct() // 去重
                   .count(); // 计算数量

// 将处理结果收集到列表中
List<String> resultList = myList.stream() // 将列表转换为流
             .filter(s -> s.startsWith("a")) // 过滤以"a"开头的元素
             .map(String::toUpperCase) // 将元素转换为大写
             .distinct() // 去重
             .sorted() // 排序
             .collect(Collectors.toList()); // 收集到列表中

示例:处理员工数据

以下是一个处理员工数据的示例,展示了如何使用Stream流来进行复杂的数据处理。

class Employee {
    private String name;
    private int age;
    private double salary;

    // 构造函数, getter 和 setter
    public Employee(String name, int age, double salary) {
        this.name = name;
        this.age = age;
        this.salary = salary;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public double getSalary() {
        return salary;
    }
}

List<Employee> employeeList = Arrays.asList(
    new Employee("张三", 30, 5000),
    new Employee("李四", 25, 6000),
    new Employee("王五", 35, 7000),
    new Employee("赵六", 28, 8000)
);

// 使用流计算年龄大于25岁的员工的平均薪水
double averageSalary = employeeList.stream() // 将员工列表转换为流
                                   .filter(e -> e.getAge() > 25) // 过滤出年龄大于25岁的员工
                                   .mapToDouble(Employee::getSalary) // 将员工对象映射为薪水的双精度值
                                   .average() // 计算平均值
                                   .orElse(0.0); // 如果没有符合条件的员工,则返回0.0

System.out.println("平均薪水: " + averageSalary); // 输出计算出的平均薪水

  1. Employee 类

    • nameagesalary 是私有属性。
    • 构造函数 Employee(String name, int age, double salary) 初始化员工对象。
    • getName()getAge()getSalary() 是用于访问私有属性的 getter 方法。
  2. 员工列表

    • 使用 Arrays.asList 创建一个包含多个 Employee 对象的列表。
  3. 计算平均薪水

    • 使用 stream() 方法将员工列表转换为流。
    • filter(e -> e.getAge() > 25) 过滤出年龄大于25岁的员工。
    • mapToDouble(Employee::getSalary) 将每个员工对象映射为薪水的双精度值。
    • average() 计算过滤后员工的平均薪水。
    • orElse(0.0) 如果没有符合条件的员工,则返回0.0。
  4. 输出结果

    • 使用 System.out.println 输出计算出的平均薪水。

在这个示例中,我们首先过滤出年龄大于25岁的员工,然后提取他们的薪水并计算平均值。

总结

通过深入探索Java中的Stream流,我们了解了它是一种强大且灵活的数据处理工具。Stream流提供了声明性的方式来操作集合数据,具有不可变性和惰性执行的特点。通过丰富的中间操作和终端操作,我们可以轻松实现复杂的数据处理任务,使代码更加简洁、可读和高效。Stream流的引入显著提升了Java编程的生产力和代码质量。

Java的Stream API提供了一种简洁而强大的数据处理方式。通过了解Stream的基础知识和常见操作,我们可以更高效地处理集合数据。

希望这篇博客能够帮助你更好地理解和使用Java的Stream流。

觉得有用的话可以点点赞 (*/ω\*),支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

  • 20
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值