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

目录

一、Stream API

1.1 概念解析

1.2 应用场景

1.3 主要方法与操作

1.4 使用示例


一、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提升数据处理的效率与代码质量。

  • 36
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值