Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
Java Stream中利用函数式参数实现数据去重与过滤_创想鸟

Java Stream中利用函数式参数实现数据去重与过滤

Java Stream中利用函数式参数实现数据去重与过滤

本文深入探讨了java stream api中`filter`方法与函数式参数的结合使用。通过分析一个具体的代码示例,我们将理解如何利用`predicate`和`function`来高效地从集合中筛选出基于特定属性的唯一元素,并揭示了其内部执行机制,包括`predicate`的生成与逐元素应用过程,以及如何通过状态管理实现去重逻辑。

理解Java Stream与filter操作

Java Stream API是Java 8引入的一项强大特性,它提供了一种声明式处理数据集合的管道化方式。filter是Stream中最常用的中间操作之一,它接收一个Predicate函数式接口作为参数,并返回一个只包含满足该Predicate条件的元素的新Stream。Predicate是一个函数式接口,定义了一个抽象方法test(T t),该方法接受一个类型为T的参数并返回一个boolean值。

Function与Predicate:函数式接口的协同

在Java中,Function和Predicate是两个核心的函数式接口。

Function:接受一个类型T的参数,并返回一个类型R的结果。例如,Person::getName就是一个Function,它接收一个Person对象并返回其姓名(String)。Predicate:接受一个类型T的参数,并返回一个boolean结果。它常用于过滤操作。

在提供的示例代码中,我们看到checkMethod方法巧妙地结合了这两个接口来实现去重逻辑。

import java.util.List;import java.util.Objects;import java.util.concurrent.ConcurrentHashMap;import java.util.function.Function;import java.util.function.Predicate;public class StreamUniqueExample {  public static void main(String[] args) {    Person p1 = new Person("test1");    Person p2 = new Person("test2");    Person p3 = new Person("test1"); // Add a duplicate for demonstration    List l = List.of(p1, p2, p3);    // 预期结果:p1和p2会被保留,p3(因为与p1同名)会被过滤掉    var count = l.stream().filter(checkMethod(Person::getName)).count();    System.out.println("Unique names count: " + count); // 应该输出 2  }  /**   * 生成一个用于过滤Stream中重复元素的Predicate。   * 该Predicate根据指定的keyExtractor提取的键值进行去重判断。   *   * @param keyExtractor 用于从元素中提取作为去重依据的键的Function。   * @param  Stream中元素的类型。   * @return 一个Predicate,当且仅当元素提取的键首次出现时返回true。   */  public static final  Predicate checkMethod(Function keyExtractor) {    Objects.requireNonNull(keyExtractor);    // 使用ConcurrentHashMap.newKeySet()创建一个线程安全的Set来存储已“见过”的键    final var seen = ConcurrentHashMap.newKeySet();    // 返回一个Predicate,其test方法在每次调用时尝试将键添加到seen集合中。    // Set.add()方法在元素首次添加时返回true,若元素已存在则返回false。    return t -> seen.add(keyExtractor.apply(t));  }}// Person.java (假设在同一文件或可访问的包中)class Person {  private String name;  Person(String name) {    this.name = name;  }  public String getName() {    return name;  }  public void setName(String name) {    this.name = name;  }  @Override  public String toString() {    return "Person{" + "name='" + name + ''' + '}';  }}

checkMethod的内部工作机制解析

checkMethod方法是实现去重逻辑的核心。让我们详细分解它的作用:

立即学习“Java免费学习笔记(深入)”;

方法签名:

public static final  Predicate checkMethod(Function keyExtractor)

它是一个泛型方法,接受一个Function作为参数,并返回一个Predicate。

keyExtractor:这个Function的目的是从Stream中的每个元素T中提取一个用于去重的“键”。在示例中,Person::getName被作为keyExtractor传入,它负责从Person对象中提取name字符串。返回类型Predicate:这意味着checkMethod的最终产物是一个可以对T类型元素进行判断(test)并返回boolean值的功能对象。

状态管理:

final var seen = ConcurrentHashMap.newKeySet();

在checkMethod内部,创建了一个ConcurrentHashMap.newKeySet()。这是一个线程安全的Set,用于存储所有已经“见过”的、由keyExtractor提取出的键。final关键字确保seen引用在checkMethod执行期间不会改变,但seen集合本身的内容是可变的。

生成Predicate:

怪兽AI数字人 怪兽AI数字人

数字人短视频创作,数字人直播,实时驱动数字人

怪兽AI数字人 44 查看详情 怪兽AI数字人

return t -> seen.add(keyExtractor.apply(t));

这是checkMethod最关键的部分。它返回一个Lambda表达式,这个Lambda表达式实际上就是一个Predicate的实例。

t:代表Stream中的当前元素(例如,一个Person对象)。keyExtractor.apply(t):调用传入的keyExtractor(例如Person::getName),从当前元素t中提取出用于去重的键(例如”test1″)。seen.add(…):尝试将提取出的键添加到seen集合中。Set.add()方法的行为至关重要:如果该键是第一次被添加到seen集合中,add()方法会成功添加并返回true。如果该键已经存在于seen集合中,add()方法不会重复添加,并返回false。

Stream执行流程详解

现在,我们结合main方法中的调用来理解整个Stream的执行过程:

checkMethod的首次调用(Predicate生成阶段):

l.stream().filter(checkMethod(Person::getName))

在Stream管道开始处理元素之前,checkMethod(Person::getName)会被立即且仅调用一次。这次调用会:

创建一个空的ConcurrentHashMap.newKeySet(),并将其引用赋值给seen变量。返回一个Lambda表达式t -> seen.add(keyExtractor.apply(t)),这个Lambda表达式就是filter方法所期望的Predicate实例。请注意,此时Stream中的任何元素都尚未被处理。

filter方法的逐元素应用(Predicate执行阶段):当Stream开始处理元素时,filter方法会遍历Stream中的每个Person对象,并对每个对象调用步骤1中生成的那个Predicate实例的test方法。

处理 p1 (Person(“test1”)):

keyExtractor.apply(p1) 返回 “test1″。seen.add(“test1”):seen集合中尚无”test1″,所以”test1″被添加到seen中,add()返回true。filter接收到true,因此p1被保留在Stream中。

处理 p2 (Person(“test2”)):

keyExtractor.apply(p2) 返回 “test2″。seen.add(“test2”):seen集合中尚无”test2″,所以”test2″被添加到seen中,add()返回true。filter接收到true,因此p2被保留在Stream中。

处理 p3 (Person(“test1”)):

keyExtractor.apply(p3) 返回 “test1″。seen.add(“test1”):seen集合中已经有”test1″了,所以add()方法不会再次添加,并返回false。filter接收到false,因此p3被从Stream中过滤掉。

count终端操作:count()方法统计经过filter操作后Stream中剩余的元素数量。在本例中,p1和p2被保留,所以最终计数为2。

注意事项与总结

Predicate的生命周期: checkMethod只执行一次,生成一个Predicate实例。这个Predicate实例内部维护着一个seen集合,并在Stream处理过程中反复被调用。状态共享: seen集合是Predicate实例的内部状态。由于filter操作是逐元素进行的,这个seen集合能够正确地记录所有已经处理过的键,从而实现去重。线程安全: 示例中使用了ConcurrentHashMap.newKeySet()来创建seen集合,这使得即使在并行Stream(l.parallelStream())中使用此Predicate,去重逻辑也能保持线程安全。通用性: 这种模式非常通用,可以用于基于任何属性(通过keyExtractor指定)对Stream中的对象进行去重。惰性求值: Stream操作是惰性求值的。filter操作本身并不会立即处理所有元素,而是在遇到终端操作(如count()、collect()等)时,才会驱动整个管道的执行。

通过上述分析,我们清晰地理解了Java Stream中filter方法如何与自定义的Predicate以及Function参数协同工作,从而高效且优雅地实现了基于特定属性的元素去重功能。这种模式充分体现了函数式编程在Java中的强大表现力。

以上就是Java Stream中利用函数式参数实现数据去重与过滤的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/309594.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
JavaScript视频流媒体开发
上一篇 2025年11月5日 04:46:29
sublime怎么对齐代码中的等号或冒号_sublime代码对齐格式化技巧
下一篇 2025年11月5日 04:46:31

相关推荐

  • Debian邮件服务器SSL证书安装方法

    在debian邮件服务器上安装ssl证书的步骤如下: 1. 安装OpenSSL工具包 首先,确保你的系统上已经安装了OpenSSL工具包。如果没有安装,可以使用以下命令进行安装: sudo apt-get updatesudo apt-get install openssl 2. 生成私钥和证书请求…

    2026年9月26日
    100
  • windows照片应用打不开怎么办 windows照片应用打不开的修复方法

    windows照片应用打不开怎么办 windows照片应用打不开的修复方法windows照片应用打不开怎么办 windows照片应用打不开的修复方法windows照片应用打不开怎么办 windows照片应用打不开的修复方法windows照片应用打不开怎么办 windows照片应用打不开的修复方法

    首先重启照片应用并结束相关进程,若无效则通过“应用和功能”修复或重置;仍无法解决时使用PowerShell重新安装应用,同时可运行系统故障排除工具检测问题;最后检查用户权限,创建新账户测试以排除配置损坏可能。 如果您尝试打开Windows照片应用时遇到无法启动或闪退的问题,可能是由于应用缓存损坏、系…

    2026年9月26日 • 用户投稿
    100
  • 兄弟“畅享绣” APP 登陆 App Store,iOS 用户开启智能刺绣新体验

    兄弟“畅享绣” APP 登陆 App Store,iOS 用户开启智能刺绣新体验兄弟“畅享绣” APP 登陆 App Store,iOS 用户开启智能刺绣新体验兄弟“畅享绣” APP 登陆 App Store,iOS 用户开启智能刺绣新体验兄弟“畅享绣” APP 登陆 App Store,iOS 用户开启智能刺绣新体验

    近日,兄弟(中国)商业有限公司宣布其智能刺绣设计应用“畅享绣”已完成 ios 系统适配及操作体验优化,现已正式上线 app store。苹果用户可通过 iphone 或 ipad 设备,便捷地将手绘图案转化为刺绣作品,以科技力量赋能传统工艺,开启全民创意刺绣新纪元。 此次 iOS 版本的发布,意味着…

    2026年9月26日 • 用户投稿
    000
  • 修复Android计算器应用崩溃:避免空值和无效字符

    修复Android计算器应用崩溃:避免空值和无效字符修复Android计算器应用崩溃:避免空值和无效字符修复Android计算器应用崩溃:避免空值和无效字符修复Android计算器应用崩溃:避免空值和无效字符

    本文旨在帮助开发者解决Android计算器应用因尝试解析空字符串或包含无效字符的字符串而导致的崩溃问题。通过在解析前进行字符串的预处理,包括判空和去除空格,可以有效避免 NumberFormatException 异常,从而提升应用的稳定性和用户体验。文章提供了详细的代码示例和注意事项,帮助开发者更…

    2026年9月26日 • 用户投稿
    000
  • Debian Hadoop权限设置有哪些要点

    在debian上设置hadoop权限时,需要考虑以下几个要点: 用户和用户组管理: 创建用户和用户组,以便在集群中进行管理。可以使用 useradd 和 groupadd 命令来创建用户和用户组。设置用户的主目录和登录shell,使用 usermod 命令修改用户信息。 文件和目录权限设置: 使用 …

    2026年9月26日
    200
  • 多模态AI如何识别特殊符号 多模态AI符号理解能力解析

    多模态AI如何识别特殊符号 多模态AI符号理解能力解析多模态AI如何识别特殊符号 多模态AI符号理解能力解析多模态AI如何识别特殊符号 多模态AI符号理解能力解析多模态AI如何识别特殊符号 多模态AI符号理解能力解析

    多模态ai理解特殊符号主要依靠数据训练与上下文分析。首先,它通过大规模标注数据学习符号在不同场景中的常见用法,例如社交媒体中的“@”或“#”;其次,结合图像和文本的上下文进行语义推理,判断如“$”是货币单位还是情绪表达;最后,借助ocr与视觉特征识别图像中的符号,并通过跨模态联合建模提升准确性。 ☞…

    2026年9月26日 • 用户投稿
    800
  • sublime怎么格式化less文件_sublime LESS文件美化方法

    sublime怎么格式化less文件_sublime LESS文件美化方法sublime怎么格式化less文件_sublime LESS文件美化方法sublime怎么格式化less文件_sublime LESS文件美化方法sublime怎么格式化less文件_sublime LESS文件美化方法

    使用插件可实现Sublime Text格式化LESS文件。1. 安装HTML-CSS-JS Prettify插件,通过命令面板搜索并安装;2. 确保文件语法设为Less;3. 配置Prettify支持Less,在用户设置中启用less_enable;4. 全选代码后右键选择Prettify Code…

    2026年9月26日 • 用户投稿
    000
  • MAC怎么让程序坞(Dock)自动隐藏_macOS程序坞自动显示与隐藏设置

    MAC怎么让程序坞(Dock)自动隐藏_macOS程序坞自动显示与隐藏设置MAC怎么让程序坞(Dock)自动隐藏_macOS程序坞自动显示与隐藏设置MAC怎么让程序坞(Dock)自动隐藏_macOS程序坞自动显示与隐藏设置MAC怎么让程序坞(Dock)自动隐藏_macOS程序坞自动显示与隐藏设置

    1、通过系统设置可开启程序坞自动隐藏,进入“系统设置→桌面与程序坞”,启用“自动隐藏和显示程序坞”功能,鼠标移至屏幕底部即可滑出;2、使用终端命令defaults write com.apple.dock autohide -bool true并重启Dock进程也可实现;3、还可通过终端调整隐藏延迟…

    2026年9月26日 • 用户投稿
    000
  • NVIDIA RTX 4090是不是性能过剩了?

    RTX 4090是否性能过剩取决于用途:1. 游戏方面,在主流游戏如《守望先锋2》《赛博朋克2077》中性能明显溢出,多数玩家难以用满其能力;2. 生产力领域,凭借24GB显存和强大算力,它在AI训练、3D渲染等任务中仍具价值;3. 技术体验上,DLSS 3、Reflex等技术提供低延迟与未来兼容性…

    2026年9月26日
    1200
  • Debian OpenSSL如何进行数字签名验证

    在debian系统上使用openssl进行数字签名验证,可以按照以下步骤操作: 准备工作 安装OpenSSL:确保你的Debian系统已经安装了OpenSSL。如果没有安装,可以使用以下命令进行安装: sudo apt updatesudo apt install openssl 获取公钥:数字签名…

    2026年9月26日
    600
  • 解决Android计算器应用崩溃问题:数字输入处理优化

    解决Android计算器应用崩溃问题:数字输入处理优化解决Android计算器应用崩溃问题:数字输入处理优化解决Android计算器应用崩溃问题:数字输入处理优化解决Android计算器应用崩溃问题:数字输入处理优化

    本文将指导你如何解决Android计算器应用在数字输入时发生的崩溃问题。如摘要所述,崩溃通常是由于尝试将空字符串或null值传递给Double.parseDouble()方法引起的。以下是详细的解决方案和最佳实践。 问题分析 在Android计算器应用中,当用户点击数字按钮时,通常会将按钮上的数字追…

    2026年9月26日 • 用户投稿
    000
  • Claude是否能用于编写剧本 AI生成剧情内容的能力与使用体验

    Claude是否能用于编写剧本 AI生成剧情内容的能力与使用体验Claude是否能用于编写剧本 AI生成剧情内容的能力与使用体验Claude是否能用于编写剧本 AI生成剧情内容的能力与使用体验Claude是否能用于编写剧本 AI生成剧情内容的能力与使用体验

    本文将围绕利用AI工具进行剧本创作这一问题展开探讨。文章会首先介绍AI在剧情生成方面的核心能力,接着通过详细的步骤讲解,指导用户如何借助AI工具进行剧本的构思、撰写与优化,从而让用户了解整个操作流程。最后,会结合实际使用体验,分析其在创作过程中的优势与需要注意的方面,帮助创作者更有效地利用这一技术。…

    2026年9月26日 • 用户投稿
    700
  • 外星人电脑无声音?声卡、音频接口故障检测方法​

    外星人电脑无声音?声卡、音频接口故障检测方法​外星人电脑无声音?声卡、音频接口故障检测方法​外星人电脑无声音?声卡、音频接口故障检测方法​外星人电脑无声音?声卡、音频接口故障检测方法​

    外星人电脑没声音的解决方法如下:1.检查音量是否静音,确认任务栏音量未设为最低或被划掉;2.排查驱动问题,通过设备管理器更新“声音、视频和游戏控制器”中的声卡驱动,或去官网下载最新驱动;3.排除外接设备故障,尝试更换耳机、音箱或usb接口;4.进入bios检查声卡是否被禁用,并调整设置;5.检查wi…

    2026年9月26日 • 用户投稿
    600
  • 《流放之路2》国服98元起 9月11日开启不删档测试

    《流放之路2》国服98元起 9月11日开启不删档测试《流放之路2》国服98元起 9月11日开启不删档测试《流放之路2》国服98元起 9月11日开启不删档测试《流放之路2》国服98元起 9月11日开启不删档测试

    《流放之路2》国服名为《流放之路:降临》,定价从98元起,豪华版分为四个档次,价格区间为198元至798元,另有典藏版售价2888元。目前游戏已在腾讯wegame平台开启预购,国服预充值不删档测试定于2025年9月11日正式开启! 98元“基础创始人资格包”包含9800点券、测试资格以及数字原声带。…

    2026年9月26日 • 用户投稿
    400
  • sublime如何安装monokai pro主题_sublime Monokai Pro主题安装教程

    sublime如何安装monokai pro主题_sublime Monokai Pro主题安装教程sublime如何安装monokai pro主题_sublime Monokai Pro主题安装教程sublime如何安装monokai pro主题_sublime Monokai Pro主题安装教程sublime如何安装monokai pro主题_sublime Monokai Pro主题安装教程

    确保安装Package Control,通过官网获取代码在Sublime控制台运行;2. 使用Ctrl+Shift+P打开命令面板,通过Package Control搜索并安装Monokai Pro;3. 再次打开命令面板选择“Monokai Pro: Activate Theme”启用主题,或手动…

    2026年9月26日 • 用户投稿
    200
  • MySQL中窗口函数用法 窗口函数在数据分析中的实际案例

    窗口函数是在一组数据行上执行计算并为每一行返回一个值的函数。它与普通聚合函数不同,保留原始数据行并进行行级计算。常见函数包括row_number()、rank()、dense_rank()以及结合over()使用的sum()、avg()等。例如,在计算销售排名时,使用rank() over(orde…

    2026年9月26日
    000
  • 蓝猫 AI 如何生成复古风图标?蓝猫 AI 复古风图标生图全解析

    蓝猫 AI 如何生成复古风图标?蓝猫 AI 复古风图标生图全解析蓝猫 AI 如何生成复古风图标?蓝猫 AI 复古风图标生图全解析蓝猫 AI 如何生成复古风图标?蓝猫 AI 复古风图标生图全解析蓝猫 AI 如何生成复古风图标?蓝猫 AI 复古风图标生图全解析

    蓝猫ai生成复古风图标的关键在于理解复古核心元素并精准控制生成过程。首先需准备不同时期复古图标数据集并进行风格训练,如8-bit游戏、早期网页设计等;其次通过关键词引导与风格控制,如使用“8-bit pixel art icon”等描述,并提供色彩饱和度、线条粗细等参数调整;第三步可在生成后添加噪点…

    2026年9月26日 • 用户投稿
    100
  • 淘宝大瓜活动怎么介绍

    淘宝大瓜活动怎么介绍淘宝大瓜活动怎么介绍淘宝大瓜活动怎么介绍淘宝大瓜活动怎么介绍

    一、活动主题与亮点 本次盛会以“有大瓜”为核心概念,象征着数不尽的惊喜优惠和隐藏福利等你来发现。精彩纷呈,众多一线品牌强势加盟,带来前所未有的折扣力度。从潮流穿搭、精致美妆,到实用家居、前沿数码,品类齐全,轻松实现一站式购齐心愿清单。 二、参与方式 打开淘宝 app,搜索关键词“有大瓜”,即可直达专…

    2026年9月26日 • 用户投稿
    000
  • 电脑电池充满电后继续插着电源会损害电池吗?

    电脑电池充满电后继续插着电源会损害电池吗?电脑电池充满电后继续插着电源会损害电池吗?电脑电池充满电后继续插着电源会损害电池吗?电脑电池充满电后继续插着电源会损害电池吗?

    笔记本电池充满后继续插电不会过充,但长期满电和高温会加速电池老化,建议启用充电阈值功能(如60%~80%),并定期浅放电以延长寿命。 电脑电池充满电后继续插着电源,这事儿说起来挺微妙的。简单来说,现代笔记本电脑在充满电后,内部的智能充电电路会接管,让机器直接使用电源适配器的电力,而不是反复充放电池。…

    2026年9月26日 • 用户投稿
    000
  • WPS如何将图片转PDF_WPS图片转PDF合并与导出方法

    WPS如何将图片转PDF_WPS图片转PDF合并与导出方法WPS如何将图片转PDF_WPS图片转PDF合并与导出方法WPS如何将图片转PDF_WPS图片转PDF合并与导出方法WPS如何将图片转PDF_WPS图片转PDF合并与导出方法

    WPS Office支持将图片转为PDF并合并导出,适用于整理照片、扫描件等。1. 单张图片转换:新建→图片转PDF→选择文件→导出即可;2. 多张图片合并:通过“添加图片”多选并调整顺序,一键合成PDF,适合制作简历或作品集;3. 可选设置包括页面尺寸、图片质量和排版,提升输出效果;4. 手机端操…

    2026年9月26日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信