Java 8及以上新特性:Lambda表达式、Stream API、Optional类与接口默认方法(二)

目录


一、Stream API

1.1 概念解析

Stream API是Java 8引入的一个重要特性,它为处理集合、数组或其他数据源提供了一种全新的、声明式的、高效且易于并行化的编程模型。Stream API引入了流式处理和函数式编程思维,将数据源看作一个可以被操作和转换的元素序列(流),并通过一系列中间操作(如过滤、映射、排序等)和终端操作(如收集、计数、遍历等)对数据进行处理。

Stream API对集合操作带来了革命性改变,它不再依赖于传统的迭代器或循环结构,而是通过管道(pipeline)的方式将多个操作串联起来,形成一个完整的数据处理流水线。这种方式不仅使得代码更简洁、更具可读性,而且由于Stream API的内部优化,能够实现自动并行化处理,显著提升大规模数据处理的性能。

1.2 应用场景

Stream API广泛应用于各种数据处理场景,显著提升代码效率与可读性:

数据过滤:通过filter()方法,根据给定的条件筛选出满足要求的元素。

List<String> filteredNames = names.stream()
    .filter(name -> name.length() > 5)
    .collect(Collectors.toList());

数据转换:使用map()方法将流中的每个元素转换为另一种形式,如将字符串转为大写。

List<String> uppercasedNames = names.stream()
    .map(String::toUpperCase)
    .collect(Collectors.toList());

数据聚合:通过reduce()sum()max()min()等方法对流中的元素进行汇总计算。

OptionalInt sum = numbers.stream()
    .mapToInt(Integer::intValue)
    .sum();

数据排序:利用sorted()方法对流中的元素进行排序。

List<String> sortedNames = names.stream()
    .sorted()
    .collect(Collectors.toList());

并行处理:通过parallelStream()方法创建并行流,利用多核处理器并行处理数据,大幅提升处理速度。

long count = numbers.parallelStream()
    .filter(n -> n % 2 == 0)
    .count();

对比传统迭代器或循环方式,Stream API的处理逻辑更清晰、更易于阅读和维护,且由于其内部的优化,能够更高效地处理大规模数据,尤其是当启用并行流时,能够显著提高计算性能。

1.3 主要方法与操作

Stream API主要包括以下几类方法:

  • 创建流:通过集合、数组的stream()parallelStream()方法,或者Stream类的静态工厂方法(如of()generate()iterate()等)创建流。

  • 中间操作:如filter()map()flatMap()peek()sorted()distinct()等,用于对流中的元素进行过滤、转换、排序、去重等操作。中间操作不会执行任何处理,而是返回一个新的流供进一步操作。

  • 终端操作:如collect()count()min()max()forEach()toArray()等,对流进行最终的汇总、计数、遍历等操作,并产生结果。执行终端操作后,流会被消费掉,无法再次使用。

  • 短路特性:部分终端操作(如anyMatch()allMatch()findFirst()findAny()等)具有短路特性,即在找到符合条件的元素或满足终止条件时,立即停止后续处理,提高效率。

这些方法可以灵活组合,构建复杂的查询逻辑,如通过多个filter()map()操作对数据进行多级过滤和转换,再通过collect()汇总结果,或者通过findFirst()找到第一个满足条件的元素。

1.4 使用示例

以下是一系列丰富的Stream API使用示例:

简单流操作

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");

// 获取名字长度大于5的姓名
List<String> longNames = names.stream()
    .filter(name -> name.length() > 5)
    .collect(Collectors.toList());

// 计算所有名字的总长度
int totalLength = names.stream()
    .mapToInt(String::length)
    .sum();

复合流操作

List<Person> people = ...;

// 获取所有年龄大于30且姓氏为"A"的人的名字
List<String> filteredNames = people.stream()
    .filter(person -> person.getAge() > 30)
    .filter(person -> person.getLastName().startsWith("A"))
    .map(Person::getFirstName)
    .collect(Collectors.toList());

并行流操作

List<Long> numbers = ...;

// 并行计算所有偶数的平方和
long sumOfSquares = numbers.parallelStream()
    .filter(n -> n % 2 == 0)
    .map(n -> n * n)
    .reduce(0L, Long::sum);

通过这些示例,读者可以直观感受到Stream API的强大功能和优雅语法,掌握其基本用法,并在实际编程中运用Stream API提升数据处理的效率与代码质量。

版权声明:本文为博主作者:普通的一个普通猿原创文章,版权归属原作者,如果侵权,请联系我们删除!

原文链接:https://blog.csdn.net/m0_61635718/article/details/137512430

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
心中带点小风骚的头像心中带点小风骚普通用户
上一篇 2024年4月22日
下一篇 2024年4月22日

相关推荐