Есть ли встроенный метод Kotlin для применения функции void к значению?

Я написал этот метод, чтобы применить функцию void к значению и вернуть значение.

public inline fun <T> T.apply(f: (T) -> Unit): T {
    f(this)
    return this
}

Это полезно для уменьшения чего-то вроде этого:

return values.map {
    var other = it.toOther()
    doStuff(other)
    return other
}

Что-то вроде этого:

return values.map { it.toOther().apply({ doStuff(it) }) }

Есть ли языковая функция или метод, подобный этому, уже встроенный в Kotlin?


person Michael Pardo    schedule 13.02.2015    source источник
comment
Просто для моего образования, смысл doStuff здесь состоит в том, чтобы оценить его побочные эффекты, немного похоже на метод peek в потоках Java 8?   -  person Greg Kopff    schedule 14.02.2015
comment
Да, я думаю, что это похоже на peek, но применяется к объекту, а не к потоку. Это также напоминает мне doOnNext() RxJava, но опять же применяется к объекту, а не к потоку. И точка doStuff действительно зависит от пользователя, но в моем случае это добавить к other кеш.   -  person Michael Pardo    schedule 16.02.2015
comment
Связанная проблема youtrack.jetbrains.com/issue/KT-6903. Не стесняйтесь голосовать или звездить, чтобы получать обновления.   -  person bashor    schedule 04.03.2015
comment
функция apply теперь является частью стандартной библиотеки Kotlin. Подробности смотрите в ответе ниже.   -  person Jayson Minard    schedule 02.01.2016


Ответы (2)


Я столкнулся с той же проблемой. Мое решение в основном такое же, как ваше, с небольшим уточнением:

inline fun <T> T.apply(f: T.() -> Any): T {
    this.f()
    return this
}

Обратите внимание, что f является функцией расширения. Таким образом, вы можете вызывать методы вашего объекта, используя неявную ссылку this. Вот пример, взятый из моего проекта libGDX:

val sprite : Sprite = atlas.createSprite("foo") apply {
    setSize(SIZE, SIZE)
    setOrigin(SIZE / 2, SIZE / 2)
}

Конечно, вы также можете позвонить doStuff(this).

person Kirill Rakhman    schedule 22.02.2015

Apply находится в стандартной библиотеке Kotlin: см. документы здесь: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/apply.html

Его сигнатура метода:

inline fun <T> T.apply(f: T.() -> Unit): T (source)

Вызывает указанную функцию f с этим значением в качестве получателя и возвращает это значение.

person Jayson Minard    schedule 02.01.2016