woong's

android Scope Function 본문

Develop/Android

android Scope Function

dlsdnd345 2021. 2. 7. 16:11
  • Let (fun <T, R> T.let(block: (T) -> R): R)
    • Context Object : it
    • Return Value : Rambda result
    • 사용목적 : let 은 null 체크 , null 이 아닌 값으로 블록을 생성할때 많이 활용 됨
    • let을 통해서 null 이 아닌 block 을 사용할때 null 인 block 을 사용하려면 (?:) 를 통해서 가능

 

 

@Test
fun testLet() {

   val user = User("woong",20)

   val returnValueName = user?.let {
      it.name //(T) -> R(name)
   }

   val returnValueAge = user?.let {
      it.age //(T) -> R(age)
   }

   val returnValueUser = user?.let {
      it.age
      it //(T) -> R(it)
   }

   println("### $returnValueUser")
}

 

  • Apply (fun <T> T.apply(block: T.() -> Unit): T)
    • Context Object : this
    • Return Value : Context Object
    • 사용목적 : 객체 초기화시 많이 활용 됨

 

@Test
fun testApply() {

    //Apply 사용 X
    val user01 = User()
    user01.name = "woong"
    user01.age = 20

    //Apply 사용 O
    val user02 = User().apply {
    	name = "woong"
	    age = 20
    }

    println("### $user02")

}

 

  • Also
    • Context Object : it
    • Return Value : Context Object
    • 사용목적 : 객체를 수정 , 변경 하지 않고 , 로그 및 정보 확인으로 활용됨
@Test
fun testAlso() {

   //Also 사용 X
   val user01 = User()
   user01.name = "woong"
   user01.age = 20
   println("### ${user01}")

   //Apply 사용 O
   User().apply {
      name = "woong"
      age = 20
   }.also {
      println("### ${it}")
   }
}

 

Run (fun <T, R> T.run(block: T.() -> R): R) , (fun <R> run(block: () -> R): R)

  •  Run
    • Context Object : this
    • Return Value : Rambda result
    • with 와 달리 Safe Call (?.) 이 가능해서 with 보다 활용도가 좋음
    • 사용 목적 : 어떤 값을 도출할때 불필요한 지역 변수의 범위를 제한할때 사용
@Test
fun testRun() {

   //Run 사용 X
   val user01 = User()
   user01.name = "woong"
   user01.age = 20

   //user 접근이 가능함
   println("### ${user01.name}(${user01.age})")

   //Run 사용 O
   val nameAge = run {

      User().apply {
         name = "woong"
         age = 20
      }.run {
         "${name}($age)"
      }
   }

   //user 접근 이 불가능하게 할수 있음
   println("### ${nameAge}")
}

 

  • With (fun <T, R> with(receiver: T, block: T.() -> R): R)
    • Context Object : this
    • Return Value : Rambda result
    • run 과 달리 not-null 객체를 사용 , 객체의 함수를 여러개 호출할때 그룹화 용도로 활용
@Test
fun testWith() {

   //With 사용 X
   val user01 = User()
   user01.name = "woong"
   user01.age = 20

   //With 사용 O
   with(user01) {
      printName()
      printAge()
   }
}

 

 

 

 

Scope Fuction Context Object Return Value
Let It Rambda result
Apply This Context Object
Also It Context Object
Run This Rambda result
With This Rambda result

 

 

Comments