double =
또는 triple을 사용해야 =
합니까?
if(a === null) {
//do something
}
또는
if(a == null) {
//do something
}
'같지 않음'의 경우 :
if(a !== null) {
//do something
}
또는
if(a != null) {
//do something
}
double =
또는 triple을 사용해야 =
합니까?
if(a === null) {
//do something
}
또는
if(a == null) {
//do something
}
'같지 않음'의 경우 :
if(a !== null) {
//do something
}
또는
if(a != null) {
//do something
}
답변:
구조적 평등 a == b
은 다음과 같이 번역됩니다.
a?.equals(b) ?: (b === null)
따라서와 비교할 때 null
구조적 동등성 a == null
은 참조 동등성으로 변환됩니다 a === null
.
에 따르면 문서 , 사용할 수 있도록 코드를 최적화하는 의미가 없습니다 a == null
및 a != null
참고 변수가 변경 가능한 속성이있는 경우, 당신은 내부의 비 nullable 형식에 스마트 캐스트를 할 수 없다는 if
문 (때문에 값이 다른 스레드에 의해 수정되었을 수 있습니다.)와 함께 안전한 호출 연산자를 사용해야합니다.let
대신 .
안전한 통화 교환 원 ?.
a?.let {
// not null do something
println(it)
println("not null")
}
Elvis 연산자와 함께 사용할 수 있습니다.
Elvis 연산자 ?:
(심문 표시가 Elvis의 머리카락처럼 보이기 때문에 추측합니다)
a ?: println("null")
그리고 코드 블록을 실행하려면
a ?: run {
println("null")
println("The King has left the building")
}
두 가지를 결합
a?.let {
println("not null")
println("Wop-bop-a-loom-a-boom-bam-boom")
} ?: run {
println("null")
println("When things go null, don't go with them")
}
if
널 검사에 사용하지 않는 이유 는 무엇입니까? a?.let{} ?: run{}
드문 경우에만 적절합니다. 그렇지 않으면 관용적이지 않습니다
null
수표를 위해 사용하지 말라고 제안하지 않았 으며 다른 실행 가능한 옵션을 나열했습니다. run
어떤 종류의 성능 저하가 있는지 확실하지 않지만 . 더 명확하게 답변을 업데이트하겠습니다.
a
가 이면 전체 범위에 대해 적절하게 바인딩된다는 보장 var
을 사용합니다 . 경우 A는 다음 차이가 없습니다. a?.let{} ?: run{}
let
a
val
val
이면 let을 사용하는 것은 다르며 나쁘다. 이 기사는 그것을 설명하는 데 매우 능숙하다는 것을 알았습니다. Kotlin : null 검사를 위해 LET를 사용하지 마십시오 .
보안 액세스 작업
val dialog : Dialog? = Dialog()
dialog?.dismiss() // if the dialog will be null,the dismiss call will be omitted
기능하자
user?.let {
//Work with non-null user
handleNonNullUser(user)
}
조기 종료
fun handleUser(user : User?) {
user ?: return //exit the function if user is null
//Now the compiler knows user is non-null
}
불변의 그림자
var user : User? = null
fun handleUser() {
val user = user ?: return //Return if null, otherwise create immutable shadow
//Work with a local, non-null variable named user
}
기본값
fun getUserName(): String {
//If our nullable reference is not null, use it, otherwise use non-null value
return userName ?: "Anonymous"
}
var 대신 val 사용
val
읽기 전용 var
이며 변경 가능합니다. 스레드로부터 안전한 읽기 전용 속성을 가능한 많이 사용하는 것이 좋습니다.
lateinit 사용
때때로 불변 속성을 사용할 수 없습니다. 예를 들어, 일부 속성이 onCreate()
호출 에서 초기화되면 Android에서 발생합니다 . 이러한 상황을 위해 Kotlin에는라는 언어 기능이 lateinit
있습니다.
private lateinit var mAdapter: RecyclerAdapter<Transaction>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mAdapter = RecyclerAdapter(R.layout.item_transaction)
}
fun updateTransactions() {
mAdapter.notifyDataSetChanged()
}
@Benito Bertoli에 추가,
조합은 실제로 if-else와 다릅니다.
"test" ?. let {
println ( "1. it=$it" )
} ?: let {
println ( "2. it is null!" )
}
결과는 다음과 같습니다.
1. it=test
그러나 다음과 같은 경우 :
"test" ?. let {
println ( "1. it=$it" )
null // finally returns null
} ?: let {
println ( "2. it is null!" )
}
결과는 다음과 같습니다.
1. it=test
2. it is null!
또한 elvis를 먼저 사용하는 경우 :
null ?: let {
println ( "1. it is null!" )
} ?. let {
println ( "2. it=$it" )
}
결과는 다음과 같습니다.
1. it is null!
2. it=kotlin.Unit
유용한 방법을 확인하면 유용 할 수 있습니다.
/**
* Performs [R] when [T] is not null. Block [R] will have context of [T]
*/
inline fun <T : Any, R> ifNotNull(input: T?, callback: (T) -> R): R? {
return input?.let(callback)
}
/**
* Checking if [T] is not `null` and if its function completes or satisfies to some condition.
*/
inline fun <T: Any> T?.isNotNullAndSatisfies(check: T.() -> Boolean?): Boolean{
return ifNotNull(this) { it.run(check) } ?: false
}
다음은 이러한 기능을 사용하는 방법의 가능한 예입니다.
var s: String? = null
// ...
if (s.isNotNullAndSatisfies{ isEmpty() }{
// do something
}