람다 그리고 코틀린
by its_TIMI fun checkUserIdRegistrationStatus(id: String): HashMap<String, Any> {
val isRegistered = userRepo.findOne(User().apply { this.userId = id }) != null
val status = if (isRegistered) RegistrationStatus.REGISTERED.name else RegistrationStatus.UNREGISTERED.name
return HashMap<String, Any>().apply {
this["type"] = "Id"
this["status"] = status
}
}
fun checkUserEmailRegistrationStatus(email: String): HashMap<String, Any> {
val isRegistered = userRepo.findOne(User().apply { this.userEmail = email }) != null
val status = if (isRegistered) RegistrationStatus.REGISTERED.name else RegistrationStatus.UNREGISTERED.name
return HashMap<String, Any>().apply {
this["type"] = "email"
this["status"] = status
}
}
이 코드들의 중복을 줄이고싶어서 지피티에게 물어봤더니
fun checkUserRegistrationStatus(predicate: (User) -> Unit, type: String): HashMap<String, Any> {
val user = User().apply(predicate)
val isRegistered = userRepo.findOne(user) != null
val status = if (isRegistered) RegistrationStatus.REGISTERED.name else RegistrationStatus.UNREGISTERED.name
return hashMapOf(
"type" to type,
"status" to status
)
}
fun checkUserIdRegistrationStatus(id: String): HashMap<String, Any> {
return checkUserRegistrationStatus({ it.userId = id }, "userId")
}
fun checkUserEmailRegistrationStatus(email: String): HashMap<String, Any> {
return checkUserRegistrationStatus({ it.userEmail = email }, "email")
}
이렇게 쓰란다. 근데 나는 람다 개념이 익숙지 않았고,,
이렇게 질문했더니 지피티가 이렇게 설명을 해줬다 ㄴㅇㄱ
물론이죠! `checkUserRegistrationStatus` 함수의 `predicate: (User) -> Unit` 부분과 `User().apply(predicate)` 구문을 설명드리겠습니다. 이 부분에서는 Kotlin의 람다 함수와 `apply` 스코프 함수를 사용하고 있습니다.
### 람다 함수 `(User) -> Unit`
- `(User) -> Unit`은 람다 함수의 타입을 나타냅니다.
- 여기서 `User`는 람다 함수의 입력 타입이고, `Unit`은 반환 타입입니다. Kotlin에서 `Unit`은 Java의 `void`와 유사합니다. 즉, 이 람다 함수는 `User` 객체를 입력으로 받아 처리하고 반환 값은 없습니다.
### 람다 함수 사용
- `checkUserRegistrationStatus` 함수는 `predicate`라는 이름의 람다 함수를 매개변수로 받습니다.
- 이 함수는 `User` 객체에 특정 작업을 수행하는 함수입니다. 예를 들어, `User` 객체의 `userId` 또는 `userEmail` 필드를 설정하는 데 사용될 수 있습니다.
### `apply` 스코프 함수와 람다 함수의 결합
- `User().apply(predicate)` 구문에서는 `apply` 스코프 함수를 사용하여 `User` 객체에 `predicate` 람다 함수를 적용합니다.
- `apply` 함수는 객체 자신(`this`)을 람다 함수의 수신 객체로 전달하고, 람다 블록 내에서 객체의 속성을 설정할 수 있게 해줍니다.
- 여기서 `predicate`는 `User` 객체에 대해 호출되어 객체의 필드를 설정합니다.
### 예시
예를 들어, `checkUserIdRegistrationStatus` 함수를 호출하면 다음과 같은 과정이 일어납니다:
1. `checkUserRegistrationStatus` 함수에 람다 함수 `{ it.userId = id }`와 `"userId"` 문자열이 전달됩니다.
2. 람다 함수 `{ it.userId = id }`는 `User` 객체의 `userId` 필드에 `id` 값을 설정합니다.
3. `apply`는 이 람다 함수를 `User` 객체에 적용하고, `findOne`을 호출하여 사용자가 존재하는지 확인합니다.
이 방식으로, `predicate` 매개변수를 사용하여 함수를 호출할 때마다 `User` 객체에 다른 작업을 수행할 수 있습니다. 이는 코드의 재사용성을 높이고, 유사한 패턴의 함수들 사이에서 중복을 줄일 수 있는 효과적인 방법입니다.
'Kotlin' 카테고리의 다른 글
[Kotlin] Coroutine - Structured Concurrency (0) | 2024.01.12 |
---|---|
[Kotlin] Coroutine의 예외처리 (0) | 2024.01.12 |
[Kotlin] Coroutine - 취소 (0) | 2024.01.11 |
[Kotlin] Coroutine - async() (1) | 2024.01.09 |
[Kotlin] Coroutine 디버깅 옵션 (1) | 2024.01.09 |
블로그의 정보
Dev_TIMI
its_TIMI