对比jdk1.8,看jdk24 Stream Gatherers牛逼在哪?

JDK 1.8 64位安装详解与教程 本文还有配套的精品资源,点击获取 简介:本文详细介绍了Java Development Kit (JDK) 1.8的安装过程,包括下载、安装、配置环境变量、卸载以及JDK 1.8的新特性。JDK 1.8是Oracle公司发布的重要Java开发工具包版本,适用于64位操作系统,并具备更好的资源利用率和性能。安装步骤包括接受许可协议、选择安装类型和位置、配置环境变量以及在必要时... 阅读详情

在这里插入图片描述

Java 1.8 引入了 Stream API,提供了如 map、filter 和 reduce 等中间操作和终端操作,极大地简化了集合处理。然而,对于一些复杂场景,如状态依赖的操作或无限流的处理,JDK 1.8 的能力有限。

JDK 24 中 JEP 485 引入新特性Stream Gatherers,旨在增强 Java Stream API 的灵活性和表达力。它允许开发者定义自定义的中间操作,这些操作可以维护状态、处理无限流,并生成新的流。

在这里插入图片描述

一、与 JDK 1.8 的主要变化

1、自定义中间操作

JDK 1.8 的 Stream API 提供了一组固定的中间操作,开发者若需实现自定义逻辑,往往需要使用状态化的 lambda 表达式或外部库,这通常导致代码复杂且难以维护。

Stream Gatherers 引入了 gather 方法,接受一个 Gatherer 对象。Gatherer 类似于 Collector,但用于中间操作而非终端操作。它由四个函数组成:initializer(初始化状态,可选)、integrator(处理每个元素)、combiner(合并并行状态,可选)和 finisher(结束处理,可选)。这允许开发者定义状态依赖的中间操作,例如跟踪前一个元素或缓冲输入。

例如,处理连续重复元素的去重操作,在 JDK 1.8 中可能需要手动维护状态,而在 Stream Gatherers 中可以直接使用 gather 定义更优雅的逻辑。

2、处理无限流

JDK 1.8 的 Stream API 在处理无限流时存在限制,许多操作(如 collect)需要终端操作,容易导致内存溢出或性能问题。

Stream Gatherers 设计上支持无限流的懒惰处理,通过 Gatherer 的机制可以动态生成输出流,特别适合如传感器数据流或事件流的场景。

例如,windowSliding 可以对无限流进行滑动窗口分析,而不会提前加载所有数据。

3、内置 Gatherers

JDK 24 提供了五个内置 Gatherers,位于 java.util.stream.Gatherers 类中,包括:

  1. windowFixed(n):将元素分组为固定大小的窗口。
  2. windowSliding(n):创建滑动窗口,每个窗口包含前一个窗口的元素(除第一个)和下一个元素。
  3. fold(initial, operation):类似左折叠,顺序处理元素。
  4. mapConcurrent(maxConcurrency, mapper):并发执行映射操作,使用虚拟线程。
  5. scan(initial, operation):计算累积结果,类似于前缀和。

这些操作在 JDK 1.8 中要么需要手动实现(如通过 reduce 或自定义收集器),要么完全不可用。例如,windowFixed(4) 可以轻松生成如 [[0,1,2,3], [4,5,6,7]] 的窗口,而 JDK 1.8 需要复杂的缓冲逻辑。

以下表格总结了部分内置 Gatherers 与 JDK 1.8 的对比:

操作JDK 1.8 实现Stream Gatherers (JDK 24)优势
固定窗口(windowFixed)通过 collect 和手动缓冲,代码复杂gather(Gatherers.windowFixed(n)),直接可用简洁,易读,性能优化
滑动窗口(windowSliding)无直接支持,需要自定义逻辑gather(Gatherers.windowSliding(n)),内置支持减少代码量,支持无限流
并发映射(mapConcurrent)使用 parallelStream().map(),受限于 fork-join 池gather(Gatherers.mapConcurrent(n, mapper)),用虚拟线程适合阻塞操作,性能提升
累积计算(scan)无直接支持,需要手动累积gather(Gatherers.scan(initial, operation)),内置支持简化实现,适合顺序处理

在这里插入图片描述

二、优化点

1、效率提升

通过标准库优化的内置 Gatherers,开发者可以避免手动实现复杂逻辑,从而减少性能开销。例如,mapConcurrent 使用虚拟线程技术,特别适合 I/O 密集型任务,相比 JDK 1.8 的 parallelStream().map(),能更好地利用现代硬件资源。

自定义 Gatherers 允许开发者针对特定场景优化逻辑,避免 JDK 1.8 中可能出现的冗余计算或内存使用。

2、并行处理

**Gatherer 支持通过 combiner 函数实现并行执行,这与 JDK 1.8 的并行流类似,但更灵活。例如,mapConcurrent 可以配置最大并发数(maxConcurrency),并利用虚拟线程技术,适合阻塞操作的并发处理,相比 JDK 1.8 的 fork-join 池更高效。

3、代码简洁性

Stream Gatherers 减少了复杂变换所需的代码量。例如,JDK 1.8 中实现滑动窗口可能需要手动维护缓冲区和状态,而使用 windowSliding 只需要一行代码。

这不仅提升了代码的可读性,还降低了手动实现的错误风险,特别是在并行场景下。

三、jdk8和jdk24分别实现滑动窗口

假设需要生成大小为 2 的滑动窗口。

1、JDK 1.8 实现

Stream<Integer> numbers = Stream.of(1, 2, 3, 4, 5);
Stream<List<Integer>> windows = numbers.collect(ArrayList::new, (list, element) -> {
    if (list.size() == 2) {
        list.remove(0);
    }
    list.add(element);
    if (list.size() == 2) {
        // 需要额外的逻辑将窗口添加到结果流
    }
}, (left, right) -> {
    // 并行合并逻辑复杂
});
// 实现复杂,且难以处理无限流

2、JDK 24 Stream Gatherers 实现

Stream<Integer> numbers = Stream.of(1, 2, 3, 4, 5);
Stream<List<Integer>> windows = numbers.gather(Gatherers.windowSliding(2));
// 直接生成 [[1,2], [2,3], [3,4], [4,5]],简洁高效

从上述对比可见,Stream Gatherers 显著简化了实现,特别适合状态依赖的操作。

一个可能出乎意料的细节是,mapConcurrent 的引入利用了虚拟线程技术(Project Loom),这在 JDK 1.8 中完全不可用。它允许并发映射操作在虚拟线程上执行,特别适合 I/O 密集型任务,如网络请求或数据库查询,相比 JDK 1.8 的 parallelStream().map(),性能提升显著。

四、结论

Stream Gatherers 在 JDK 24 中为 Java Stream API 带来了重大改进,相较于 JDK 1.8,它提供了更强的自定义能力、更好的无限流支持和优化的并行处理。通过内置 Gatherers 和自定义操作,开发者可以更高效地处理复杂流变换,提升代码可读性和性能。

五、国内直接使用最新GPT-4.5、满血ChatGPT4o、o1、o3-mini-high、满血DeepSeek R1、马斯克Grok 3

✅️ChatGPT使用地址:www.nezhasoft.cloud

在这里插入图片描述

1、纯原版ChatGPT、Claude

✅️官网原生页面

✅️真实Team会员账号

2、技术支持

✔️支持最新ChatGPT-4.5、满血ChatGPT-4o、o1、o3-mini、o3-mini-high、o1 pro

✔️Claude 3.7 Sonnent

✔️满血DeepSeek R1、马斯克Grok 3

✔️无需魔法、个人独享

3、支持所有GPTs + 自定义插件

支持ChatGPT所有插件,可创建自己的ChatGPT插件,使用朋友分享的自定义插件。

例如最强编程插件Code Copilot、AI绘画插件DALL-E、论文专属Consensus。

在这里插入图片描述

ui(new Ui::MainWindow)的解析 Ui命名空间的变量名,和默认空间的变量名虽然一样,但实际是两个不同的东西。所以构造函数中调用MainWindow是没问题的,因为它不是在调用自身,而是在调用其他命名空间下的另一个同名的MainWindow类。这里使用C++的成员初始化列表语法,初始化成员变量指针ui,可这里有个问题,在MainWindow的构造函数中new 一个MainWindow,这又调用一下MainWindow的构造函数,这岂不是会死循环?ui_mainwindow.h文件。mainwindow.h文件. 阅读详情

相关推荐

智驾域控制器硬件架构:从接口丛林到算力核心的工程解码

本文深入解析了智驾域控制器硬件架构的设计挑战与工程实践。面对复杂的接口丛林,文章详细探讨了如何高效融合摄像头、雷达等多源传感器数据,并构建以多SOC为核心的强大算力平台。同时,文章强调了电源、时钟、散热等最小系统及车规级可靠性设计的关键作用,为工程师提供了从接口驯服到算力核心协同的完整硬件解码指南。

happy2的博客 482

jdk1.8下载与安装教程(2023最新版)

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。jdk1.8又称jdk8.0,是目前相对比较稳定的版本,不建议下载最新的jdk版本,因为最新版的jdk不稳定,在Java的学习中可能会出现各种各样的问题。

shencanggang的博客 6万+

Transformer——从原理、模型架构到内部细节介绍

Transformer模型是一种基于注意力机制的深度学习模型,最早由Google在2017年的论文《AttentionIsAllYouNeed》中提出。自其问世以来就迅速席卷了自然语言处理他(NLP)领域,并在各类主流任务上取得了新的突破,包括机器翻译、语言建模、序列标注和文本分类等。在NLP领域取得巨大成功后,迅速扩展到了计算机视觉(CV)领域,并带来了革命性的变化。这种基于自注意力机制的深度学习模型,不仅在NLP任务中力压群雄,也成为CV领域的新宠。

小拉拉的博客 1万+

Jdk1.8的下载、安装及环境配置

本篇文章讲述了 jdk1.8 从下载到使用的全过程

qq_58036691的博客 6万+

使用kmplot在线进行生存分析

欢迎关注”生信修炼手册”!kmplot是一个生存分析的在线工具,最初是设计用来对肝癌中的miRNA进行生存分析,对应的文章发表在scientific reports上,链接如下https...

庐州月光的博客 1万+

三种 绘制奈奎斯特曲线 的方法

如何绘制Nyquist曲线 提供三种绘制方法,其中使用最广泛的是概略图绘制方法 ①解析法绘制 ②概略图法绘制 ③MATLAB绘制

weixin_46664967的博客 6万+

JDK1.8安装和环境配置教程(2024年11月16日)

摘要:下载JDK 8u261安装包,并解压。 双击exe文件进行安装,按照提示完成安装过程。 配置环境变量,包括JAVA_HOME和CLASSPATH。 在系统变量Path中添加JAVA_HOME\bin路径。 检验安装是否成功,通过输入java -version命令查看JDK版本信息。

i_for的博客 11万+

UDS诊断服务基础详解之二19服务

本文主要介绍UDS统一诊断服务的19 01服务,包含状态位和故障码的解析以及19 01服务的具体说明

车载网络小D的博客 1万+

jdk1.8的安装和环境变量的配置最新版(超详细,保姆级教程)

jdk1.8又称jdk8.0,是目前相对比较稳定也是日常开发中用得最多的版本,但为什么不建议下载最新的jdk版本呢,那是因为最新版的jdk不稳定,在Java的学习中可能会出现各种各样的问题。jdk1.8完全能够满足大家学习和在工作中的使用。

m0_51520179的博客 2万+

基于STM32LXXX的模数转换芯片ADC(TLA2528IRTER)驱动C程序设计

define TLA2528_ADDR 0x12 << 1 // 用于HAL传输的8位地址(写入为0x24,读取为0x25)// 100kHz (示例值,需根据实际时钟计算)#define TLA2528_REG_PIN_CFG 0x00 // 引脚配置寄存器。#define TLA2528_REG_CHN_SEL 0x01 // 通道选择寄存器。

myron6688的博客 229

如何正确的计算两个角度的角度差?

这一步是必要的,因为它确保了无论a相对于b是在逆时针方向还是顺时针方向,d2总是正确地反映出绕圆相反方向的角度差。这样,当函数进行最后的比较时,它能够准确地比较两个方向的旋转路径并选择最短的一个。

小秋 AI SLAM 入门实战教程 4135

一篇文章搞定JDK1.8下载、安装以及环境配置(带官网下载地址)

绝对良心,手把手,嘴对嘴,胎教级JDK8下载安装和环境配置教程。常见错误都有说明,搞不定的可以来看看。

2401_82883308的博客 1万+

8.5华为OD机试真题 新系统 - 最长不连续子串 (Java/Py/C/C++/Js/Go)

8.5华为OD机试真题 新系统 - 最长不连续子串 (Java/Py/C/C++/Js/Go)

算法大师! 622

JDK1.8安装教程及其环境变量配置

最近在使用Tomcat需要配置jdk,但以前安装的jdk17因为版本过高,出现不兼容,因此安装了jdk1.8,现在我来记录一下Windows下JDK1.8下载和配置环境变量的过程。

2201_75956750的博客 2万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

JAVA-JDK1.8介绍

Java 8为开发人员带来了许多新特性和改进,使得Java语言更加现代化、灵活和易用。它通过引入Lambda表达式、Stream API、新的日期和时间API等功能,提供了更简洁、高效的编程方式,同时也提高了代码的可读性和可维护性。

分享,学习,专注,努力,向上。 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

JDK1.8下载安装教程

JDK1.8下载安装教程 目录 JDK1.8下载安装教程 一、下载地址: 二、具体的安装步骤如下: 三、配置环境变量 四、检验是否配置成功 一、下载地址: 链接:https://pan.baidu.com/s/1KXeckB5vIKPjejK2DzqEtA提取码:66sf 二、具体的安装步骤如下: 1.下载好了安装包后,双击进入安装向导。 2.点击下一步。 3.默认会在C盘,这里选择更改安装路径。 4.根据各自习惯选择安装路径,建议最内层的文件夹名是JDK的版本号...

weixin_40052304的博客 4168

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

JDK1.8的安装及环境变量的配置(超详细)

jdk的安装配置,修改路径,配置环境变量,注意事项

ChatYU的博客 8万+

JDK 1.8 下载安装,配置环境变量

向下滑动到 JDK1.8的下载界面,如下图所示:选择JDK的版本,根据您的操作系统选择适当的版本。这里我们是选择 下载Windows版本的,下载。点击环境变量,打开后看到上面是用户变量,下面的系统变量。注意(用户变量是用于当前用户的配置,系统变量是对所有用户配置)。安装过程可能需要几分钟时间,取决于你的计算机配置。可以接受默认安装路径,也可以选择其他路径,并点击。安装完成后,会弹出一个安装完成的提示框。配置 Path 继续点击 新建,配置多个变量可以用。至此我们的配置以及完成。,我这里选择默认的路径。

m0_70098804的博客 2万+

JDK1.8安装教程(图文详细讲解)

jdk1.8又称jdk8.0,是目前相对比较稳定的版本,不建议下载最新的jdk版本,因为最新版的jdk不稳定,在Java的学习中可能会出现各种各样的问题。

楠哥的博客 3万+

JDK1.8下载与安装完整教程

检测是否安装成功,管理员身份运行输入java -version

qq_57756904的博客 2万+

Java8环境安装(jdk1.8安装)详细教程

Java 8(也称为JDK 1.8),是Oracle公司于2014年3月发布的一个重要的Java语言版本。这个版本自发布以来,因其众多的新特性和改进,被认为是Java语言发展历程中的一个重要里程碑。Lambda表达式Lambda表达式是一种匿名函数,它允许将函数作为方法的参数,使代码更加简洁、灵活。通过->操作符将参数列表与Lambda体分隔开,可以方便地实现只有一个抽象方法的接口(函数式接口)。提供了类型推断功能,编译器可以根据上下文自动推断Lambda表达式的参数类型。

m0_65818274的博客 3万+

Java入门 (超详细)JDK(1.8)下载与安装及环境变量的配置教程

准备一个安装位置的文件夹,选择安装的文件夹命名最好不要有空格,如:jdk 8,可以是jdk_8或是jdk-8都行。这是我的第一篇文章,是学习 Java 过程的第一步。上一步安装完成后会弹出下面这个页面,点击更改选择刚刚创建好的 jre 文件夹,选择无误后直接点击下一步就会进入安装状态。注:我的安装路径是 E:\javaApps\JDK_8,图中的此电脑>胡桃(E)中文是自己给盘符重命名的。下面的步棸都是固定的 ,变量名内容直接复制就可以啦,防止出错。不想要注册的小伙伴可以选择下载我的网盘分享呀!

小庆的博客 8万+

JDK1.8下载、安装与配置完整图文教程

JDK已经更新到19.2了,JDK1.8是相对比较稳定的版本,网上的JDK1.8安装配置教程一大堆,但是很多都过时了,自己整理了一篇JDK1.8下载安装的详细步骤,有着每一步的完整的图文教程,大家可以根据自己的需要下载,2023最新版~

狼魂之力 2万+

JDK1.8在Windows环境下的安装与环境变量配置

JDK1.8在Windows环境下的安装与环境变量配置

记录和分享属于我的“IT”时光。 1万+

JDK1.8安装,环境配置以及其中遇到的各种问题

jdk1.8环境安装,配置以及可能出现的各种问题及解决方法

在读研究生 4627

JMeter 安装教程(详细安装教程)

JMeter 安装教程(详细安装教程)

Deng872347348的博客 6万+
上一篇: 华为OD机试 - 报文回路(Python/JS/C/C++ 2025 A卷 100分)
下一篇: 华为OD机试 - 阿里巴巴找黄金宝箱(II) - 贪心思维(Python/JS/C/C++ 2025 A卷 100分)
哪 吒
哪 吒 2022年度博客之星TOP 1 2022年度博客之星TOP 1 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 59万+粉丝 2933原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哪 吒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值