আমার কি দ্বিগুণ =, বা ট্রিপল ব্যবহার করা উচিত =?
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
নোট করুন যে যদি ভেরিয়েবলটি একটি পরিবর্তনীয় সম্পত্তি হয় তবে আপনি এটিকে 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এটি varহয় a?.let{} ?: run{}তবে গ্যারান্টিটি ব্যবহার করে letএটি পুরো ক্ষেত্রের জন্য সঠিকভাবে আবদ্ধ হবে । যদি aএটি valহয় তবে কোনও পার্থক্য নেই।
valতবে লেট ব্যবহার করা আলাদা এবং এটি খারাপ। আমি এই নিবন্ধটি এটি ব্যাখ্যা করে খুব ভাল পেয়েছি - কোটলিন: নাল চেক করার জন্য কেবল এলইটি ব্যবহার করবেন না ।
সুরক্ষিত অ্যাক্সেস অপারেশন
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পরিবর্তনযোগ্য। এটি যতটা পঠনযোগ্য কেবল ততটুকু বৈশিষ্ট্য ব্যবহার করার পরামর্শ দেওয়া হয়েছে, সেগুলি থ্রেড-নিরাপদ।
ল্যাটিনাইট ব্যবহার করুন
কখনও কখনও আপনি পরিবর্তনযোগ্য বৈশিষ্ট্য ব্যবহার করতে পারবেন না। উদাহরণস্বরূপ, অ্যানড্রয়েডে ঘটে যখন কিছু সম্পত্তি onCreate()কল দেওয়া হয় is এই পরিস্থিতিতে কোটলিনের একটি ভাষা বৈশিষ্ট্য রয়েছে 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()
}
@ বেনিটো বার্তোলিতে যোগ করা,
সংমিশ্রণটি আসলে-অন্যরকম নয়
"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!
এছাড়াও, যদি প্রথমে এলভিস ব্যবহার করে:
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
}