为何Function::apply可作为BiFunction传入Seq.zip方法?
为什么
Function::apply能适配BiFunction参数? 先明确当前代码的泛型上下文:
- 调用
zip的seq是Seq<UnaryOperator<String>>,因此zip方法的泛型参数T为UnaryOperator<String>(UnaryOperator是Function的子接口) split是List<String>,所以zip的U为String- 最终返回
Seq<String>,因此zip要求的BiFunction具体类型是:BiFunction<UnaryOperator<String>, String, String>
Function::apply的适配逻辑
Function::apply是实例方法的方法引用,它能被适配成BiFunction类型,本质等价于以下Lambda表达式:
(UnaryOperator<String> func, String input) -> func.apply(input)
这种适配的核心原因是Java方法引用的特殊规则:
当上下文需要一个接收两个参数的函数式接口时,实例方法的方法引用可以被解读为:
- 第一个参数作为调用该实例方法的对象
- 第二个参数作为实例方法的入参
- 最终返回实例方法的执行结果
放到当前场景中:
- 第一个参数
func是UnaryOperator<String>(属于Function子类,拥有apply方法) - 第二个参数
input是String,作为func.apply的入参 func.apply(input)返回String,完全匹配BiFunction<UnaryOperator<String>, String, String>的方法签名。
实际执行效果
在zip方法的逻辑中,会逐个配对seq中的操作符与split中的字符串:
- 第一个操作符是
String::toLowerCase,对应split的第一个字符串,执行后将首段字符串转为全小写 - 后续操作符都是
capitalize,对应split的后续字符串,执行后将每个单词首字母大写、其余字母小写 - 最终通过
join("")拼接所有处理后的字符串,完成下划线到驼峰的转换。
内容的提问来源于stack exchange,提问作者Osiris
相关产品推荐
相关产品推荐

