Dev_TIMI

람다 그리고 코틀린

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

활동하기