java - 从 Kotlin 调用需要 Function 参数的 Java 方法
问题描述
我在将这部分 Java 转换为 Kotlin 时遇到问题:
Publishers.map(chain.proceed(request), response -> {
if (request.getCookies().contains("SOME_VALUE")) {
response.cookie(request.getCookies().get(STATE_COOKIENAME).maxAge(0));
}
return response;
});
该map
方法的第二个参数(注意Publishers
不是集合)采用Function<T,R>
. 我尝试了几种解决方案,包括提供一个 lambda:
Publishers.map(chain?.proceed(request), {
x: MutableHttpResponse<*>!,
y: MutableHttpResponse<*>! -> print("It worked")
})
但这会导致:
错误:(32, 38) Kotlin: Unexpected token
错误:(33, 38) Kotlin: Unexpected token
错误:(31, 27) Kotlin:类型推断失败:fun map(publisher: Publisher!, mapper: Function!): Publisher! 不能应用于 (Publisher>!>?,(MutableHttpResponse<>, MutableHttpResponse<*>) -> Unit)
错误:(31, 56) Kotlin: Type mismatch: inferred type is (MutableHttpResponse< >, MutableHttpResponse< >) -> Unit but Function>!, MutableHttpResponse<>?>! 预计
并提供一种方法:
return Publishers.map(chain?.proceed(request), ::processCookie)
private fun processCookie(a: MutableHttpResponse<*>?) {
print("something something something")
}
这导致:
错误:(31, 27) Kotlin:类型推断失败:fun map(publisher: Publisher!, mapper: Function!): Publisher! 不能应用于 (Publisher>!>?,KFunction1<@ParameterName MutableHttpResponse<>?, Unit>)
错误:(31, 56) Kotlin: Type mismatch: inferred type is KFunction1<@ParameterName MutableHttpResponse<>?, Unit> but Function>!, MutableHttpResponse<*>?>! 预计
对于上下文,我认为在 kotlin中尝试本教程会很有趣。
解决方案
您没有在 lambda 中指定返回类型,它是由 Kotlin 推断的。最后一个例子不起作用,因为函数的返回类型Unit
是void
Java 中的。我会尝试以下方法:
return Publishers.map(chain?.proceed(request), ::processCookie)
private fun processCookie(a: MutableHttpResponse<*>?) : MutableHttpResponse<*>? {
print("something something something")
return a
}
如果你写它也可能有效
return Publishers.map(chain?.proceed(request)) {
print("something something something")
it
}
我们这里使用 Kotlin 中 Lambda 的默认参数名称——即it
. Kotlin 编译器将为您推断类型。Kotlin 还允许将函数的最后一个 lambda 参数移到括号外。
Java 的功能接口的最后一件事,例如Function<T,R>
. 您可能需要明确使用名称,例如
return Publishers.map(chain?.proceed(request), Function<T,R> {
print("something something something")
it
})
whereT
和R
必须用实际类型替换
推荐阅读
- c# - 多次访问对象的公共字段还是将其缓存在变量中更好?
- angularjs - 带有所需字母数字的 AngularJs 输入
- qt - 发送信号后如何刷新qml中的组合框
- html - 用户上传文件后如何填充数据库
- python - Python数据框匹配列表中的字符串
- java - 如何启动 selenium Microsoft Edge?
- html - 如何使用带有 JSON 的 Angular/TypeScript 编写上传/下载代码?
- .net - 在 linux 上将 dotnet 可执行文件安装到 PATH 中
- c++ - 客户端-服务器之间的 tcp 传输是否有数据限制?
- vue.js - 替换标签动态返回对象而不是内容