ฉันควรใช้ double =
หรือ triple =
?
if(a === null) {
//do something
}
หรือ
if(a == null) {
//do something
}
ในทำนองเดียวกันสำหรับ 'not equals':
if(a !== null) {
//do something
}
หรือ
if(a != null) {
//do something
}
ฉันควรใช้ double =
หรือ triple =
?
if(a === null) {
//do something
}
หรือ
if(a == null) {
//do something
}
ในทำนองเดียวกันสำหรับ 'not equals':
if(a !== null) {
//do something
}
หรือ
if(a != null) {
//do something
}
คำตอบ:
ทั้งสองวิธีสร้าง bytecode เดียวกันเพื่อให้คุณสามารถเลือกอะไรก็ได้ที่คุณต้องการ
ความเท่าเทียมกันของโครงสร้างa == b
ถูกแปลเป็น
a?.equals(b) ?: (b === null)
ดังนั้นเมื่อเทียบกับnull
ที่เท่าเทียมกันของโครงสร้างจะแปลให้สมการอ้างอิงa == null
a === null
ตามเอกสารไม่มีจุดใดในการเพิ่มประสิทธิภาพโค้ดของคุณดังนั้นคุณสามารถใช้a == null
และa != null
โปรดทราบว่าหากตัวแปรเป็นคุณสมบัติที่ไม่แน่นอนคุณจะไม่สามารถส่งสมาร์ทให้เป็นประเภทที่ไม่เป็นโมฆะได้ภายในif
คำสั่ง (เนื่องจาก ค่าอาจถูกแก้ไขโดยเธรดอื่น) และคุณต้องใช้ตัวดำเนินการโทรปลอดภัยlet
แทน
ผู้ให้บริการโทรปลอดภัย ?.
a?.let {
// not null do something
println(it)
println("not null")
}
คุณสามารถใช้ร่วมกับตัวดำเนินการเอลวิสได้
ผู้ดำเนินการเอลวิส?:
(ฉันเดาว่าเพราะเครื่องหมายคำถามดูเหมือนผมของเอลวิส)
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
เป็น a var
ให้ใช้การa?.let{} ?: run{}
รับประกันว่าจะถูกผูกมัดอย่างถูกต้องในlet
ขอบเขตทั้งหมด ถ้าa
เป็นval
แล้วไม่มีความแตกต่าง
val
แล้วการใช้ let แตกต่างกันและมันก็แย่ ผมพบว่าบทความนี้ดีมากที่อธิบายมัน - Kotlin: ไม่เพียงแค่ใช้ 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"
}
ใช้ val แทน var
val
เป็นแบบอ่านอย่างเดียวvar
ไม่แน่นอน ขอแนะนำให้ใช้คุณสมบัติอ่านอย่างเดียวให้มากที่สุดเท่าที่จะทำได้ซึ่งเป็นคุณสมบัติที่ปลอดภัยต่อเธรด
ใช้ lateinit
บางครั้งคุณไม่สามารถใช้คุณสมบัติที่ไม่เปลี่ยนรูปได้ ตัวอย่างเช่นเกิดขึ้นบน Android เมื่อคุณสมบัติบางอย่างเริ่มต้นในการonCreate()
โทร สำหรับสถานการณ์เหล่านี้มีคุณสมบัติ 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
}