如何修改Function<T,R>参数类型?实现int[]到Integer[]的函数适配
解决Function<int[], Integer>到Function<Integer[], Integer>的适配问题
首先明确:你无法修改java.util.function.Function<T,R>接口本身的类型参数,但可以通过包装转换实现类型适配,把Function<int[], Integer>转换成符合integerMap要求的Function<Integer[], Integer>。
核心思路很简单:在包装函数内部,把传入的Integer[]数组拆箱为int[],再调用原函数即可。因为Java不会自动在Integer[]和int[]之间做转换,所以需要手动处理这个步骤。
完整实现代码
import java.util.function.Function; public class FunctionAdapter { public static Integer integerMap(Function<Integer[], Integer> integerFun, Integer[] integerArr) { return integerFun.apply(integerArr); } public static void main(String[] args) { // 示例:定义一个接收int[]的函数,计算数组元素总和 Function<int[], Integer> intArraySumFunc = arr -> { int sum = 0; for (int num : arr) { sum += num; } return sum; }; // 实现类型适配的包装函数 Function<Function<int[], Integer>, Function<Integer[], Integer>> funWrap = intFunc -> { // 返回适配后的Function,接收Integer[]并转成int[]调用原函数 return integerArr -> { // 将Integer[]拆箱为int[] int[] intArr = new int[integerArr.length]; for (int i = 0; i < integerArr.length; i++) { // 处理可能的空值,可根据业务调整逻辑(比如抛出异常) intArr[i] = integerArr[i] != null ? integerArr[i] : 0; } return intFunc.apply(intArr); }; }; // 适配后调用integerMap方法 Integer[] testArr = {1, 2, 3, 4}; Integer result = integerMap(funWrap.apply(intArraySumFunc), testArr); System.out.println(result); // 输出10 } }
关键点说明
- 完全不需要操作
byte[],这是多余的步骤。我们只需要处理Integer[]到int[]的元素拆箱转换即可。 - 注意空值处理:如果原
Integer[]数组中存在null,直接拆箱会抛出NullPointerException,代码中做了简单的空值转0处理,你可以根据实际业务需求调整(比如抛出自定义异常)。 - 这个包装逻辑是通用的,任何
Function<int[], R>类型的函数都可以通过该方式适配为Function<Integer[], R>。
内容的提问来源于stack exchange,提问作者madMax
相关产品推荐
相关产品推荐

