Как сравнить два kotlin.jvm.functions в Java - PullRequest
1 голос
/ 15 марта 2019

Я сталкивался с этим

private final Function1<byte[], Boolean> successConditionForResponse;

и удивляюсь, как сравнить два из них на Java или Kotlin?

I search , но не могу найти конкретно

Ответы [ 2 ]

0 голосов
/ 16 марта 2019

Ну, что вы хотите, чтобы это сравнение сделало? Функции equals on будут проверять, являются ли они одним и тем же объектом, потому что он не переопределяет реализацию по умолчанию (как и ==, но вы не захотите использовать его для объектов в Java). Так что, если вы этого хотите, все готово.

Если вы хотите проверить, что две функции равны семантически (то есть они дают один и тот же результат и имеют одинаковые побочные эффекты при вызове любых аргументов), нет способа сделать это, и там на самом деле не может быть по известным математическим причинам.

Наконец, вы, возможно, захотите узнать, созданы ли они одной и той же лямбдой и захватывают одинаковые значения. Это должно быть возможно сделать для лямбд Kotlin путем их сериализации и сравнения результатов , для лямбд Java нужно создать их особым образом . Это своего рода хакерский и медленный, но может быть достаточно хорош.

0 голосов
/ 15 марта 2019

Случай 1.
Допустим, у вас есть:

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

В этом случае вам назначены две функции Котлина для двух val с.
Если выЕсли вы хотите сравнить результаты двух функций по заданному аргументу, вы можете сделать:

if(a(someByteArray) == b(someByteArray))

Вместо этого, если вы действительно хотите сравнить две функции, вы можете просто сделать:

if(a == b)

Случай 2.
Допустим, у вас есть:

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

В этом случае у вас нет двух функций Котлина, но есть два объекта типа Function1<T, R>.

Аналогично предыдущему случаю:

Сравнение результатов функций:

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

Сравнение двух объектов типа Function1<ByteArray, Boolean>:

if(a == b)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...