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

Java 扩展函数式接口详解:BiFunction、BinaryOperator 与原生接口实战

一、前言

在实际开发中,我们总会遇到一些特殊场景:比如需要接收两个参数、需要对同一类型数据进行运算、需要避免装箱拆箱开销……这时候,四大核心接口就不够用了。

本篇文章将会讲四大核心接口的升级版—— 常用扩展函数式接口。这些接口都是基于四大核心接口延伸而来,完全贴合生产场景,高频使用且实用性极强,学会它们,就能彻底搞定Java函数式接口的所有常用场景,不用再重复自定义接口。

二、扩展接口的核心逻辑

在讲具体接口之前,先搞懂一个核心逻辑:所有扩展函数式接口,本质都是四大核心接口的补充,没有新增复杂逻辑,只是针对特定场景做了优化,比如:

  • 核心接口只能接收1个参数 → 扩展接口支持接收2个参数(Bi系列);

  • 核心接口的输入和输出类型可以不同 → 扩展接口强制输入和输出类型相同(Operator系列);

  • 核心接口使用包装类型(Integer、Long等) → 扩展接口使用原生类型(int、long等),避免装箱拆箱开销(原生类型系列)。

记住这个逻辑,学习扩展接口就会非常轻松——本质是核心接口的场景化优化,不用重新记全新的逻辑。

三、Bi系列接口

Bi是“Binary”(二元)的缩写,代表“接收两个参数”。Bi系列接口对应三大核心接口(Consumer、Function、Predicate),没有BiSupplier(因为Supplier无参,双参无意义),共3个常用接口,是生产中最高频的扩展接口。

1、BiConsumer<T, U>:双参消费者

1.核心定位

对应核心接口:Consumer<T>(单参无返回)

核心差异: 接收两个参数,无返回值,用于“消费两个数据”的场景(比如修改对象的两个属性、打印两个数据)。

2.核心方法

// 核心抽象方法:接收T、U两个参数,无返回值 void accept(T t, U u); // 常用默认方法:链式消费(先消费t和u,再消费after的accept方法) default BiConsumer<T, U> andThen(BiConsumer<? super T, ? super U> after) {     Objects.requireNonNull(after);     return (l, r) -> { accept(l, r); after.accept(l, r); }; }

3.实战示例(2个高频场景)

  • 示例1:修改对象的两个属性(最常用)

import java.util.function.BiConsumer; // 复用之前的User类 class User {     private String name;     private int age;     // getter/setter、toString省略 } public class BiConsumerTest {     public static void main(String[] args) {         User user = new User();         // Lambda实现BiConsumer,接收两个参数(String姓名、int年龄),修改User属性         BiConsumer<User, String> setName = (u, name) -> u.setName(name);         BiConsumer<User, Integer> setAge = (u, age) -> u.setAge(age);         // 链式调用:先设置姓名,再设置年龄         setName.andThen(setAge).accept(user, "李四", 28);         System.out.println(user); // 输出:User(name=李四, age=28)     } }
  • 示例2:打印两个数据(简化多参数打印)

// Lambda实现BiConsumer,接收两个String参数,打印输出 BiConsumer<String, String> printTwoStr = (str1, str2) ->      System.out.println("第一个字符串:" + str1 + ",第二个字符串:" + str2); // 调用accept()方法,传入两个参数 printTwoStr.accept("Hello", "BiConsumer");  // 输出:第一个字符串:Hello,第二个字符串:BiConsumer

2、BiFunction<T, U, R>:双参函数

1.核心定位

对应核心接口:Function<T, R>(单参有返回)

核心差异: 接收两个参数,返回一个结果,用于“根据两个数据,转换得到一个新数据”的场景(比如两个数相加、拼接两个字符串)。

2.核心方法

// 核心抽象方法:接收T、U两个参数,返回R类型结果 R apply(T t, U u); // 常用默认方法:链式转换(先执行当前BiFunction,再执行after的apply方法) default <V> BiFunction<T, U, V> andThen(Function<? super R, ? extends V> after) {     Objects.requireNonNull(after);     return (t, u) -> after.apply(apply(t, u)); }

3.实战示例(2个高频场景)

  • 示例1:两个整数相加(基础场景)

    <
http://www.jsqmd.com/news/676466/

相关文章:

  • 思源宋体TTF版本:解决中文排版难题的7种字重完整方案
  • 如何实现Figma界面实时中文翻译:FigmaCN插件核心技术解析与部署指南
  • 别再只用生日当密码了!手把手用C++实现一个简易版‘密码发生器‘(灵感来自蓝桥杯)
  • 在Windows 10上用GTX 960M显卡跑YOLOv5:基于Pascal VOC 2012数据集的训练效率实测与调优心得
  • 手把手教你给LVGL V7.9做‘内存体检’:快速定位样式泄漏与界面卡死元凶
  • 2026年合肥无人机培训机构深度测评,这5家谁更专业 - 品牌企业推荐师(官方)
  • 别再只调陀螺仪了!用OpenCV实现基于透视变换的EIS防抖,实测效果媲美手机
  • HTML函数在多开浏览器标签时卡顿吗_内存管理优化建议【技巧】
  • 从‘弱智吧’QA数据到专属AI:手把手教你用Xtuner+Qwen1.5打造一个会玩梗的聊天机器人
  • 春联生成模型-中文-base实战体验:输入“安康”、“勤勉”等词实测
  • 国标GB28181对讲避坑指南:为什么你的摄像头不支持?聊聊设备兼容性与私有协议那些事
  • 忘记压缩包密码?这个开源工具让你5分钟找回访问权限
  • 数字信号处理中时间反转技术的原理与应用
  • 自适应学习系统中的行为理论与认知负荷优化
  • B站视频转文字终极指南:免费开源神器5分钟快速上手
  • 高效实现OBS跨程序视频传输:Spout2插件完整解决方案
  • 别再只会改颜色了!用QT的QSS给QPushButton做个‘一键三连’的完整皮肤(附代码)
  • 告别循环:手把手教你将Matlab矩阵运算改写为CUDA Kernel(附mexFunction实战代码)
  • 保姆级教程:手把手教你用PyTorch在UNet中集成SKNet和CBAM注意力模块
  • C# 14原生AOT打包Dify客户端,从218MB到12MB,微软官方未公开的6步精简法,仅限首批内测开发者掌握
  • ExtractorSharp:游戏资源编辑器的架构设计与技术实现深度解析
  • Keil MDK升级到Arm Compiler 6后,我的‘热重启变量’保存功能失效了?手把手教你修复
  • 如何用Tsukimi打造你的终极Linux媒体中心:3个技巧让Emby和Jellyfin体验更完美
  • LabVIEW状态机实战:从3个按钮的Demo到数据采集系统的UI状态管理
  • MATLAB科研绘图配色进阶:从吸管取色到创建专属三色渐变colormap
  • 教务通知语音预播方案:用文字转语音工具提升沟通效率
  • C# AI服务上线前必做的7项.NET 11推理压测指标(含插件安装校验清单、CUDA内存泄漏检测脚本)
  • ComfyUI Impact Pack:彻底改变你的AI图像工作流
  • 哔哩下载姬完整指南:5分钟掌握B站视频高效下载与批量处理技巧
  • 告别反复烧写!用TFTP+NFS在I.MX6U上实现Linux内核与根文件系统的网络化调试(保姆级避坑指南)