Функция копирования Kotlin с условиями - PullRequest
0 голосов
/ 27 августа 2018

Есть ли способ использовать copy функцию Котлина и использовать исходное свойство значения объекта в случае, если условное состояние не проверено? Или подобная функция, которая делает это?

Пример:

data class UserEntity(
    id = String,
    email = String,
    firstName = String,
    lastName = String
)

data class UserUpdate(        
    firstName = String?,
    lastName = String?
)

@Service
class UserService(userRepository: UserRepository) {

    fun update(id: String, dto: UserUpdate) = userRepository.save(
        userRepository.findById(id).copy(
            // *it* is not available as the initial object the  
            // copy function is called from.
            firstName = dto.firstName ?: it.firstName,
            // I'd like something like:
            lastName = dto.lastName ?: keepTheOriginalLastNameProperty
        )
    )

}

1 Ответ

0 голосов
/ 27 августа 2018

Вы можете использовать функцию takeIf для условий встраивания. Он возвращает null, если предикат имеет значение false, что позволяет вам связать его в ?:.

firstName = dto.firstName.takeIf { it.isNotEmpty() } ?: user.firstName

Хорошо сочетается с let.

val something = other.takeIf { it.someBool }?.let { Something(it) } ?: throw Exception()

РЕДАКТИРОВАТЬ: в качестве ответа на ваши изменения, к сожалению, лучший вариант, который я вижу, это:

fun update(id: String, dto: UserUpdate) = run {
    userRepository.findById(id).let { user ->
        val firstName = dto.firstName ?: user.firstName
        val lastName = dto.lastName ?: user.lastName
        user.copy(firstName = firstName, lastName = lastName)
    }.let {
        userRepository.save(it)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...