ویژگی هایی که مدت ها در کاتلین منتظرش بودید

Kotlin 2.4.20 در مورد مجموعه های شما نظر می دهد و کامپایلر 2.2 در نهایت یاد می گیرد که اتاق را بخواند.
برخی از ویژگی های کاتلین هنگام ورود توجه زیادی را به خود جلب می کنند. برخی دیگر بسیار کمتر قابل توجه هستند، اما همچنان نوشتن کدهای روزمره را کمی آسان تر می کنند. دو نمونه از دومی allDistinctBy/allEqualBy در Kotlin 2.4.20 و وضوح حساس به متن است که به صورت تجربی در Kotlin 2.2 معرفی شد.
allDistinctBy/ allEqualBy: راهی ساده تر برای بررسی مجموعه ها
برای سالها، بررسی اینکه همه مقادیر یک مجموعه منحصربهفرد هستند، اغلب به این صورت بود:
val users = listOf(
User(name = "A", age = 20),
User(name = "B", age = 25),
User(name = "C", age = 30)
)
users.map { it.age }.distinct().size == users.size // true
کار می کند، اما لیست دیگری ایجاد می کند، موارد تکراری را حذف می کند، نتیجه را می شمارد، و سپس اندازه ها را مقایسه می کند تا یک پاسخ بولی دریافت کند.
Kotlin 2.4.20 راه مستقیم تری را برای بیان همان بررسی اضافه می کند:
users.allDistinctBy { it.age } // true
users.allEqualBy { it.age } // false
allDistinctBy به محض اینکه یک نسخه تکراری پیدا کرد، false را برمی گرداند، بنابراین نیازی به پردازش کل مجموعه یا ایجاد یک مجموعه جداگانه ندارد. allEqualBy برعکس عمل میکند: بررسی میکند که همه عناصر وقتی از انتخابگر عبور میکنند مقدار یکسانی تولید کنند.
هر دو تابع با Iterable، Sequence و آرایه ها کار می کنند. آنها از برابری ساختاری استفاده می کنند. برای مقادیر ممیز شناور، آنها از معنای Double.equals پیروی می کنند، بنابراین NaN برابر با NaN در نظر گرفته می شود، در حالی که -0.0 با 0.0 متفاوت است.
آنها هنوز @ExperimentalStdlibApi هستند، بنابراین قبل از استفاده از آنها در کد تولید، باید شرکت کنید. پرس و جوهای اساسی allDistinct() و allEqual() نیز برای مدتی در YouTrack وجود داشته اند و ظاهر آنها در کتابخانه استاندارد مدت هاست که دیر شده به نظر می رسد.
رزولوشن حساس به زمینه: تکرارهای کمتر در چه زمانی
ویژگی دوم بیشتر در مورد نحو است. هنگامی که کامپایلر از قبل نوع کار با آن را میداند، گاهی اوقات میتوانید نوع واجد شرایط را حذف کنید.
قبل از:
enum class Problem { CONNECTION, AUTHENTICATION, DATABASE, UNKNOWN }
fun message(problem: Problem): String = when (problem) {
Problem.CONNECTION -> "connection"
Problem.AUTHENTICATION -> "authentication"
Problem.DATABASE -> "database"
Problem.UNKNOWN -> "unknown"
}
با وضوح حساس به زمینه:
fun message(problem: Problem): String = when (problem) {
CONNECTION -> "connection"
AUTHENTICATION -> "authentication"
DATABASE -> "database"
UNKNOWN -> "unknown"
}
کامپایلر ممکن است یک مشکل از نوع مورد انتظار را در دستور when مطرح کند و نام های نامشخص را بر این اساس حل کند. این با ورودیهای enum و سایر اعلانهای پشتیبانیشده، از جمله اعضای سلسله مراتب مهر و موم شده و اعلانهای شی، در زمینههایی که اطلاعات نوع لازم در دسترس است، کار میکند.
با این حال، یک گرفتاری وجود دارد. وضوح حساس به زمینه هنوز آزمایشی است. این به طور تجربی در Kotlin 2.2 معرفی شد و به -Xcontext-sensitive-resolution در گزینه های کامپایلر نیاز دارد.
یکی از دلایل دقت، ابهام است. اگر اعلامیه دیگری با همین نام وارد محدوده شود، فرم کوتاهتر ممکن است مبهم شود. کامپایلر هشدارهایی را برای برخی از این موارد اضافه کرده است، اما همچنان ارزش دارد که این تابع را آزمایشی بدانیم و نه فرض کنیم که نحو کاملاً حل شده است.
هیچ کدام از اینها ویژگی را غیرقابل استفاده نمی کند. این فقط به این معنی است که در حال حاضر برای آزمایشها و پروژههایی که در آن با استفاده از ویژگیهای آزمایشی Kotlin احساس راحتی میکنید، مناسبتر است.
آیا واقعاً باید از آنها استفاده کنید؟
allDistinctBy / allEqualBy اضافات بسیار ساده ای هستند. اگر قبلاً از APIهای استاندارد کتابخانهای آزمایشی استفاده میکنید، آنها جایگزینهای مفیدی برای مدلهای مجموعه دقیقتر هستند که آنها به آن اشاره میکنند.
رزولوشن حساس به زمینه ارزش امتحان کردن را در پروژه جانبی یا پایگاه کدی دارد که ویژگیهای کامپایلر آزمایشی قابل قبول است. می تواند کد enum-heavy و sealed-class-heavy را برای خواندن آسان تر کند، به خصوص در کدهایی که حاوی عبارات زمانی زیادی است.
کاتلین به حذف تکه های کوچک الگوها از کدهای روزمره ادامه می دهد. هیچ یک از این ویژگیها روش ساخت اپلیکیشنها را تغییر نمیدهند، اما هر دوی آنها برخی از الگوهای رایج Kotlin را کمی تمیزتر میکنند.
و به من نگویید که این ویژگی ها را نمی خواستید 😎
![]()
ویژگیهایی که مدتها در Kotlin منتظر آن بودید، در ابتدا در ProAndroidDev در Medium پست شدند، جایی که مردم با برجسته کردن و پاسخ دادن به این داستان به گفتگو ادامه میدهند.


