BiFunction的使用

一、一句话定义

BiFunction 是一个函数式接口,它接收两个参数,对它们进行处理,并返回一个结果。

简单来说,它就像一个需要两个输入才能产生一个输出的 "函数"。

二、接口定义

BiFunction 位于 java.util.function 包下,其核心定义如下:

java

运行

csharp 复制代码
@FunctionalInterface
public interface BiFunction<T, U, R> {
    R apply(T t, U u);
}
  • T: 第一个参数的类型。
  • U: 第二个参数的类型。
  • R: 返回结果的类型。
  • apply(T t, U u) : 核心方法,接收两个参数并返回一个结果。

三、与其他函数式接口的对比

为了更好地理解,我们把它和之前讨论过的接口放在一起对比:

表格

接口 输入参数 返回值 作用
Consumer<T> 1 个 消费一个对象
Function<T, R> 1 个 1 个 将一个对象转换为另一个对象
BiFunction<T, U, R> 2 个 1 个 将两个对象转换为一个对象
Supplier<R> 0 个 1 个 提供一个对象
Predicate<T> 1 个 boolean 判断一个对象是否满足条件

BiFunction 的核心特点就是接收两个参数。

四、常见用法和场景

1. 创建和使用 BiFunction

方式一:匿名内部类(老式写法)

java

运行

sql 复制代码
// 创建一个 BiFunction,用于计算两个整数的和
BiFunction<Integer, Integer, Integer> addFunction = new BiFunction<Integer, Integer, Integer>() {
    @Override
    public Integer apply(Integer a, Integer b) {
        return a + b;
    }
};

// 使用 apply 方法调用
int result = addFunction.apply(5, 3); // result = 8

方式二:Lambda 表达式(现代写法,最常用)

java

运行

arduino 复制代码
// 创建一个 BiFunction,用于拼接两个字符串
BiFunction<String, String, String> concatFunction = (str1, str2) -> str1 + " " + str2;

// 使用 apply 方法调用
String fullName = concatFunction.apply("Hello", "World"); // fullName = "Hello World"

2. 作为方法参数传递

BiFunction 经常作为参数传递给其他方法,用于处理数据。

java

运行

typescript 复制代码
// 一个通用的计算方法
public static <T, U, R> R calculate(T a, U b, BiFunction<T, U, R> function) {
    return function.apply(a, b);
}

// 使用
// 计算乘积
int product = calculate(5, 3, (x, y) -> x * y); // product = 15

// 组合用户信息
String userInfo = calculate("张三", 25, (name, age) -> name + "今年" + age + "岁");
// userInfo = "张三今年25岁"

3. 在集合操作中的应用

Map 接口有一个 replaceAll 方法,它接收一个 BiFunction 作为参数,用于根据键和值更新映射关系。

java

运行

javascript 复制代码
Map<String, Integer> prices = new HashMap<>();
prices.put("Apple", 10);
prices.put("Banana", 5);

// 将所有价格增加 2
prices.replaceAll((fruit, price) -> price + 2);

// 遍历输出
prices.forEach((k, v) -> System.out.println(k + ": " + v));
// 输出:
// Apple: 12
// Banana: 7

五、常用操作符

BiFunction 提供了一些默认方法,可以方便地进行函数组合。

  • andThen(Function<? super R, ? extends V> after) : 在 BiFunction 执行完之后,再执行一个 Function

java

运行

ini 复制代码
// 先求和,再将结果转为字符串
BiFunction<Integer, Integer, Integer> add = (a, b) -> a + b;
Function<Integer, String> convertToString = (num) -> "结果是: " + num;

BiFunction<Integer, Integer, String> addAndConvert = add.andThen(convertToString);

String result = addAndConvert.apply(3, 4); // result = "结果是: 7"

六、总结

  • BiFunction<T, U, R> 是一个接收两个参数(TU)并返回一个结果(R)的函数式接口。
  • 核心方法是 apply(T t, U u)
  • 常用于需要两个输入进行处理并得到一个输出的场景,如数据转换、计算、集合更新等。
  • 它是 Function 接口的 "双参数" 版本,是 Java 函数式编程中不可或缺的一部分。
相关推荐
小蒜学长16 小时前
vue旅游攻略网站(代码+数据库+LW)
java·数据库·vue.js·spring boot·后端·旅游
凤山老林16 小时前
轻量级规则引擎落地:Spring Boot 集成 LiteFlow 实现动态业务编排与热更新
java·spring boot·后端·规则引擎·liteflow
夏贰四16 小时前
管控数据加载调度如何规避任务冲突?数据加载运维监控体系该如何搭建?
java·大数据·运维
山甫aa16 小时前
JavaWeb后端开发学习手册
java·开发语言·数据库·学习·mysql·springboot·web
鱼鳞_16 小时前
热门八股-JVM
java·jvm
ly768916 小时前
XML 从入门到实践:语法、命名空间、XPath、XSD 与 Java 安全解析
xml·java·python
长谷深风11117 小时前
好的 Tool Schema,不是字段越全越好
java·大数据·人工智能·ai agent·agent工作流·智能体设计·ai产品设计
IT 行者17 小时前
用 HiddenHttpMethodFilter 解决浏览器不支持 PUT/DELETE/PATCH 的问题
java·spring
晚安code17 小时前
Redis 内存淘汰策略实战:什么时候淘汰、怎么选、怎么防缓存击穿
java·redis·缓存
goyeer17 小时前
Liunx日志管理与journalctl
java·linux·运维·服务器·运维开发·信息化·信息化企业管理