Kotlin'in Java'ya Göre Avantajları (Kotlin vs Java)
Kotlin’i Java’ya nazaran daha kullanışlı, avantajlı (ve havalı) kılan nedir, Kotlin'in avantajları nelerdir, neden Android için Kotlin kullanmalıyız? (kotlin vs java, java vs kotlin).
val reasonMsg = when (reason) {
WifiP2pManager.P2P_UNSUPPORTED -> "P2P desteklenmiyor"
WifiP2pManager.ERROR -> "hata oluştur"
WifiP2pManager.BUSY -> "cihaz başka bir bağlantı ile meşgul"
else -> ""
}
💁♂️ Functional Arguments
💦 Gereksiz yere parantez ( kullanımı yoktur
⚙️ Bu yapı ile otomatik olarak son fonksiyona tanımlanan işlemler atanır
📢 Functional argument olursa, sadece metot {} kullanılması durumunda sadece son argümana değer atanır
➕ Function Extension
💁♂️ Tanımlı olan sınıflara . operatörü ile metotlar ekleyebilirsiniz
👇 Alttaki örnekte Uri sınıfına getInputStream metodu ekliyoruz
📢 Uri sınıfı temel java sınıflarından birisidir
🔪 Dizileri Parçalama
🎯 Range metodu kullanılarak diziler parçalanabilmekte
🐥 Çok kolay kullanımı vardır
🐍 Python dizi parçalama işlemlerine benzemektedir
val byteArray = ByteArray()
val slicedByteArray: List<Byte> = BUFFER.slice(3..5)
val bas = 10
val son = 100
val slicedByteArray2: List<Byte> = BUFFER.slice(bas..son)
💱 Dizileri Dönüştürme
🚀 toTypedArrayeklentisi ile direkt olarak List'i argümana çevirebilirsiniz
📈 Java'dan çok daha verimli
val quakes: List<Quake>
val args: Array<out Quake> = quakes.toTypedArray()
/* Java
List<String> yourList = List.of("hello", "world");
yourVarargMethod(yourList.toArray(new String[0]));
*/
💎 Keyword Argument
✨ Değişkenlerin adları ile onlara değer atayabilirsin
📢 Functional argument olursa, sadece metot {} kullanılması durumunda sadece son argümana değer atanır
💠 Parametre Olarak Fonksiyon
💁♂️ Fonksiyonlar obje ise parametre olarak da kullanılabilir
fun func(inFunc: (ByteArray) -> Unit) {
// ...
inFunc()
}
// Func kullanımı
func {
// inFunc içeriği
]
var func2 = { byteArray -> /* ... */ }
func(func2)
👨💼 Run - Apply - Let - Also
👪 Bir değişkenin birden fazla metodunu kullanmayı sağar
🐣 Apply objelerine değer atarsınız
▶️ Run ile alt metotlarını kullanırsın, sonucunu döndürürsünüz
🙋♂️ Let ile objeyi koşullu kullanabilirsin
💁♂️ Also ile "işlemi bitirmeden bir de bunu yap" deriz
📈 Tekrar tekrar yazmayı engeller
val wifiFilter = IntentFilter().apply {
addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION)
addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION)
}
obje.run {
metot2() // obje.metot2()
metot3() // obje.metot3() Döndürülür
}
obje?.let { // Koşullu kullanım
it.metot2() // obje.metot2()
it.metot3() // obje.metot3()
}
channel?.also { channel ->
wifiReceiver = WifiDirectBroadcastReceiver(manager, channel, this)
}
// Yer değiştirme
a = b.also { b = a }
👀 Dokümantasyon Linkleri
👇 Metotların üzerine geldiğinizde (hover) açıklamasında doküman linki olur
⭐ Link üzerinden kullanım örneklerine erişirsiniz
📃 XML ID'lerini Koda Import Etme
🔗 Kotlin otomatik olarak xml idlerini projeye dahil eder
👨💻 import kotlinx.android.synthetic.main.<layour>.* ile dahil edilir
💦 findViewByID metoduna gerek yoktur
👮♂️ İzinlerin Kontrolü
📢 İzin tanımlanmadığında hata verir
💁♂️ @SupressLint("MissingPermission") ile bunu engelleyebilirsiniz
🤭 "Ne yaptığımın farkındayım, bana bulaşma" demek gibi
🚧 Coroutine
🕊️ Thread işlemlerini kolaylaştıran bir hafif yapıdır
👷♂️ Coroutine ile inline thread kullanabilirsin
👮♂️ Main (UI), IO, Default thread yapıları ile arka plan işlemlerini yönetirsiniz
✨ Otomatik olarak optimize edilirler
🧱 Dispatchers.Main
🔣 Dispatchers.IO
🎳 Dispatchers.Default
UI Thread işlemleri
Disk ve network işlemleri
CPU gerektiren işlemler
Fonksiyon çağırma
Database
Liste sıralama
View işlemleri
Dosya okuma & yazma
JSON parsing
LiveData işlemleri
Ağ işlemleri
DiffUtils
🗃️ RoomDB Coroutine Scope
👮♂️ suspend anahtar kelimesi ile thread gerektiren metotlar belirlenir
❌ Thread gerektiren metotlar UI Thread üzerinde çalıştırılamaz
🌌 Coroutine scope içerisinde kendilerine özgü thread ile çalıştırılır
👋 AsyncTask'a elveda (zaten sevmedim 🙄)
ViewModel
fun refreshQuakes(quakes: List<Quake>) = viewModelScope.launch {
repository.deleteAll() // Dao üzerinden suspend metottur
repository.insert(quakes.toTypedArray())
}
/*
@Dao
abstract class QuakeDao {
@Query("DELETE FROM ${Quake.TABLE_NAME}")
abstract suspend fun deleteAll() // Burada suspend ile thread istiyoruz
}
*/
🔗 Faydalı Kaynaklar
🧐 Daha Fazla
🧐 Size birini mi anımsattı? ()
🚀 Android Kotlin Extension'ları paketi altındadır
🧙♂ Detaylı bilgi için alanına bakabilirsin.
💡 ile parametre olarak verilebilir
🧙♂ Detaylı bilgi için ve alanlarına bakabilirsin.