如何在Java中比较两个kotlin.jvm.functions

3
我遇到了这个。
private final Function1<byte[], Boolean> successConditionForResponse;

而且不知道如何在Java或Kotlin中比较这两个?

搜索了,但没有找到具体的方法。


1
Android Studio可以为您完成这项工作。 - Jon Goodwin
1
比较,如若它们相等?嗯,在技术上它们都是对象,而每个对象都有一个equals方法...只是不确定它是否返回您期望的结果。 - Fred
2个回答

2

那么,你希望这个比较做什么?在函数上使用equals将检查它们是否是相同的对象,因为它不会重写默认实现(所以也会使用==,但你不想养成在Java中使用它来处理对象的习惯)。所以如果这就是你想要的,你已经完成了。

如果你想检查两个函数是否在语义上相等(也就是说,当对任何参数进行调用时,它们产生相同的结果并具有相同的副作用),那么没有办法可以做到这一点,出于众所周知的数学原因,这确实是不可能的。

最后,你可能想知道它们是否由相同的lambda创建并捕获相同的值。对于Kotlin lambdas,可以通过序列化它们并比较结果来实现,对于Java lambdas,需要以特定方式创建它们。这有点像一个hack且速度较慢,但可能已经足够好了。


-1

情况1。
假设你有:

val a: (ByteArray) -> Boolean = ...
val b: (ByteArray) -> Boolean = ...

在这种情况下,您有两个Kotlin函数分配给两个val
如果您想比较给定参数上的两个函数的结果,则可以执行以下操作:
if(a(someByteArray) == b(someByteArray))

相反,如果你真的想比较这两个函数,你可以简单地执行以下操作:

if(a == b)

情况2。
假设你有:

val a: Function1<ByteArray, Boolean> = ...
val b: Function1<ByteArray, Boolean> = ...

在这种情况下,您没有两个Kotlin函数,而是有两个类型为Function1<T, R>的对象。

与前面的情况类似:

比较函数结果:

if (a.apply(someByteArray) == b.apply(someByteArray))

比较两个类型为 Function1<ByteArray, Boolean> 的对象:

if(a == b)

谢谢,我看到了 Kotlin 中的这段代码 Intrinsics.areEqual(successConditionForResponse1, successConditionForResponse2),它是如何比较的呢? - Tord Larsen
这只是一个检查相等性的静态方法。您可以在此处找到实现:https://github.com/JetBrains/kotlin/blob/master/libraries/stdlib/jvm/runtime/kotlin/jvm/internal/Intrinsics.java - gpunto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接