当前位置: 首页 > article >正文

Java 8的Stream API

引言

Java 8引入了Stream API,这是对Java集合操作的一次重大革新。Stream API提供了一种高效且易于使用的方式来处理数据集合,特别是通过支持函数式编程风格,使得代码更加简洁和可读。

Stream API简介

 什么是Stream?

Stream是Java 8中引入的一个新抽象,它允许你以声明式的方式处理数据集合。Stream可以看作是对集合的高级迭代器,但它不仅仅是一个迭代器,它还提供了丰富的操作,如过滤、映射、排序、聚合等。

Stream的特点

  • 惰性求值:Stream的操作是惰性的,只有在终端操作执行时才会真正开始处理数据。

  • 不可变性:Stream不会修改源数据,所有的操作都会生成一个新的Stream。

  • 并行处理:Stream API天然支持并行处理,可以轻松地将顺序流转换为并行流。

 Stream API的基本操作

创建Stream

Stream可以通过多种方式创建,常见的包括:

  • 从集合创建:List.stream()

  • 从数组创建:Arrays.stream(array)

  • 使用Stream的静态方法:Stream.of()

List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();

中间操作

中间操作是对Stream进行处理的步骤,常见的中间操作包括:

  • filter(Predicate):过滤元素

  • map(Function):将元素映射为另一种形式

  • sorted():排序元素

  • distinct():去重

List<String> result = list.stream()
                          .filter(s -> s.startsWith("a"))
                          .map(String::toUpperCase)
                          .collect(Collectors.toList());

终端操作

终端操作是Stream的最终处理步骤,常见的终端操作包括:

  • forEach(Consumer):对每个元素执行操作

  • collect(Collector):将Stream转换为集合

  • reduce(BinaryOperator):将Stream中的元素归约为一个值

  • count():计算Stream中的元素数量

long count = list.stream()
                 .filter(s -> s.startsWith("a"))
                 .count();

Stream API的高级用法

并行流

通过parallelStream()方法,可以轻松地将顺序流转换为并行流,从而利用多核处理器的优势。

List<String> result = list.parallelStream()
                          .filter(s -> s.startsWith("a"))
                          .collect(Collectors.toList());

自定义收集器

Java 8提供了Collectors类来支持常见的收集操作,但你也可以自定义收集器来实现更复杂的数据处理。

Collector<String, ?, TreeSet<String>> intoSet = 
    Collector.of(TreeSet::new, TreeSet::add, (left, right) -> { left.addAll(right); return left; });

TreeSet<String> set = list.stream()
                          .collect(intoSet);

流的拼接与拆分

Stream API还支持流的拼接与拆分操作,如flatMap()可以将多个流合并为一个流,limit()和skip()可以用于流的拆分。

List<List<String>> lists = Arrays.asList(
    Arrays.asList("a", "b"),
    Arrays.asList("c", "d")
);

List<String> flatList = lists.stream()
                             .flatMap(List::stream)
                             .collect(Collectors.toList());

Stream API的实战应用

数据处理与转换

Stream API非常适合用于数据处理与转换场景,如从数据库中读取数据并进行过滤、映射等操作。

List<User> users = userRepository.findAll();
List<String> names = users.stream()
                          .filter(user -> user.getAge() > 18)
                          .map(User::getName)
                          .collect(Collectors.toList());

数据统计与聚合

Stream API可以方便地进行数据统计与聚合操作,如计算平均值、最大值、最小值等。

Double averageAge = users.stream()
                         .mapToInt(User::getAge)
                         .average()
                         .orElse(0);

并行处理大数据集

对于大数据集,使用并行流可以显著提高处理速度。例如,处理一个包含百万条记录的数据集时,并行流可以充分利用多核CPU的优势。

List<User> users = userRepository.findAll();
List<String> names = users.parallelStream()
                          .filter(user -> user.getAge() > 18)
                          .map(User::getName)
                          .collect(Collectors.toList());


http://www.kler.cn/a/536205.html

相关文章:

  • 虚幻基础17:动画蓝图
  • MFC 的 CListCtrl 控件,使用SetItemState 方法来设置选中某个 item,如何达到效果和鼠标点击一致
  • tcpdump 的工作层次
  • 第二次连接k8s平台注意事项
  • Linux学习笔记16---高精度延时实验
  • 【数据结构-Trie树】力扣720. 词典中最长的单词
  • 栈和队列的实现(C语言)
  • 解决aspose将Excel转成PDF中文变成方框的乱码问题
  • esp32 udp 客户端 广播
  • 【Elasticsearch】nested聚合
  • Day67:类的继承
  • 树莓派5添加摄像头 在C++下调用opencv
  • Junit5使用教程(6)--高级特性2
  • HTML学习之CSS三种引入方式
  • 基于JavaWeb开发的java Springboot实现教务管理系统
  • 介绍10个比较优秀好用的Qt相关的开源库
  • Linux后台运行进程
  • 网络安全 | 什么是XSS跨站脚本攻击?
  • 如何利用 Python 爬虫按关键字搜索淘宝商品
  • C++基础系列【5】namespace using
  • JAVA异步的TCP 通讯-客户端
  • 【STM32系列】利用MATLAB配合ARM-DSP库设计FIR数字滤波器(保姆级教程)
  • Shell-变量及注释
  • Qt修仙之路2-1 炼丹初成
  • JS的几种具体异常类型(报错)
  • 半导体物理与器件篇8 光电器件