유틸리티 Kotlin

1. let
값이 존재할 때 코드블록 추가 수행
null이 아닐 때만 실행하는 코드를 if 문 없이 단일 라인으로 구현
o?.let {external.extra(it)}

if (o != null) {
  external.extra(o)
}

/**
* Calls the specified function [block] with `this` value as its argument and returns its result.
*/
@kotlin.internal.InlineOnly
public inline fun <T, R> T.let(block: (T) -> R): R {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
return block(this)
}
2. apply
생성된 인스턴스 멤버에 추가적인 로직 수행
fun init():HttpLoggingIntercepter {
  return HttpLoggingIntercepter().apply {
    level = if (BuildConfig.DEBUG) {BODY} else {NONE}
  }
}
HttpLoggingIntercepter의 멤버 level

/**
* Calls the specified function [block] with `this` value as its receiver and returns `this` value.
*/
@kotlin.internal.InlineOnly
public inline fun <T> T.apply(block: T.() -> Unit): T {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
block()
return this
}
3. run
생성된 인스턴스 메소드를 호출한다
view.run {
  findViewById()
}
view.findViewById() 대신 findViewById()

/**
* Calls the specified function [block] and returns its result.
*/
@kotlin.internal.InlineOnly
public inline fun <R> run(block: () -> R): R {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
return block()
}

/**
* Calls the specified function [block] with `this` value as its receiver and returns its result.
*/
@kotlin.internal.InlineOnly
public inline fun <T, R> T.run(block: T.() -> R): R {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
return block()
}
4. lazy
val textView by lazy {findViewById<TextView>(R.id.textView)}
실제 사용될 때 실행

5. lateinit
한번 초기화되면 null일 가능성이 없는 멤버에 사용. var 만 사용가능


덧글

댓글 입력 영역