Kotlin Yazıları #2 Basit Operatörler

If İfadesi

Şahsen Java’daki ? : (Ternary operator) yapısını kullanmayı çok sevdiğim için aşağıdaki kod örneklerinden 3 numaralı olanı seçerim. Kotlin inline if yapısını bu şekilde desteklemekte. Ki 3 numaralı versiyon varken inline if e gerek de yok.

1.  Geleneksel kullanım

var max = a
if (a < b) max = b

2.  else ile birlikte

var max: Int
if (a > b) {
     max = a
} else {
     max = b
}

3.  İfade olarak (expression)

val max = if (a > b) a else b

4. İfade olarak

val max = if (a > b) {
     print("Choose a")
     a
} else {
     print("Choose b")
     b
}

Not : If ifadesini bir expression olarak kullanıyorsanız (örneğin, değerini döndürerek veya bir değişkene atayarak) ifade, else yapısına sahip olmak zorundadır. Yani Java’daki inline if (? :)  yapısında olduğu gibi burada da if i expression olarak kullanmak istiyorsak else eklemek zorundayız.

 

When İfadesi

When yapısı Java ve C tipi dillerden bildiğimiz üzere Switch yapısına karşılık gelmektedir. İfade olarak veya durum olarak yazılabilmektedir. İf – else gibi de çalışabilmektedir if gibi çalışıp tüm durumlara da uğrayabilmektedir. Şu şekilde yazılmaktadır.

when (x) {
     0,  1 -> print("x == 1")
     2 -> print("x == 2")
     else -> {
          print("x is neither 1 nor 2")
     }
}

Eğer when yapısı ifade olarak kullanıldıysa, else yapısı zorunludur. Else tahmin edebileceğiniz üzere Default’un görevini görmektedir. Eğer derleyici tüm durumları yazdığınıza ikna olursa else zorunlu değildir.

Case olarak istediğimiz (keyfi) ifadeleri yazabiliriz. Örneğin:

when (x) {
     parseInt(s) -> print("s encodes x")
     else -> print("s does not encode x")
}

When aynı zamanda if – else zincirinin yerine de kullanılabilir.

when {
     x.isOdd() -> print("x is odd")
     x.isEven() -> print("x is even")
     else -> print("x is funny")
}

 

is ve !is İfadeleri

Bir nesnenin, çalışma zamanında belirli bir türe uygun olup olmadığını, is operatörünü veya ters formunu kullanarak kontrol edebiliriz. Java’daki instanceof yapısına karşılık gelmektedir.

if (obj is String) {  // !is de kullanılabilir
     print(obj.length)
}

Range yapısı

Burada Swift’teki for yapısına benzer yeni bir tarz ortaya çıkıyor. Herhangi bir rakamın herhangi bir aralıkta olup olmadığını çok kolay bir şekilde görebiliyoruz.

if (i in 1..10) {  //  1 <= i && i <= 10 ile aynı görevi görüyor
     println(i)
}
for (i in 1..4) print(i) //  "1234" yazar

for (i in 4..1) print(i) // Hiçbirşey yazdırmaz peki tersine döngü yok mudur ? tabiiki  vardır:

for (i in 4 downTo 1) print(i) // "4321" yazar Peki 2 şer veya 3 er sayı geçebilmek nasıldır ?

for (i in 1..4 step 2) print(i) // "13" yazar.

for (i in 4 downTo 1 step 2) print(i) // "42" yazar.

 

is ve Range yapılarına bir göz attıktan sonra When yapısına 2 örnek daha yazabilirim.

Range yapısı ile birlikte When kullanımı :

when (x) {
     in 1..10 -> print("x is in the range")
     in validNumbers -> print("x is valid")
     !in 10..20 -> print("x is outside the range")
     else -> print("none of the above")
}

is yapısı ile When kulanımı

fun hasPrefix(x: Any) = when(x) {
     is String -> x.startsWith("prefix")
     else -> false
}

 

For döngüsü

Yazının burasına gelebildiyseniz For döngüsünü size açıklamam gerekmiyor diye düşünüyorum 😊

Kullanım 1; Java C# gibi dillerde olduğu gibi tek tek item item alabildiğimiz yöntem:

for (item in collection) print(item)

Kullanım 2; for içerisi bir blok olabilir(köşeli parantezlere dikkat)

for (item: Int in ints) {
       // ...
}

For, yineleyici sağlayan her obje veya liste için kullanılabilir.

Kullanım 3; Eğer for bloğu içerisinde, integer bir indexe ihtiyaç duyarsanız:

for (i in array.indices) {
     print(array[i])
}

Kullanım 4; kullanım 3 e alternatif olarak bu yolu da tercih edebilirsiniz. Kullanım 3, 2, 1biraz daha Java’cılar için basitken Kullanım 4 e alışmak biraz daha zor olabilir. But Kotlin way is this:

for ((index, value) in array.withIndex()) {
     println("the element at $index is $value")
}

 

While Döngüsü

While ve Do-While döngülerinde değişen bir şey yok. Onlar bildiğiniz gibi.

while (x > 0) {
     x--
}

 

do {
     val y = retrieveData()
} while (y != null) // y is visible here!

Aynı şekilde Break ve Continue yapıları da her Object Oriented dilde çalıştığı mantıkta çalışmaktadır.

 

Smart Cast

Kotlin’de açık ClassCast lara ihtiyaç duymayız. Bir Casting işlemi şu şekilde yapılabilir:

fun demo(x: Any) {
     if (x is String) {
          print(x.length) // x String’e otomatik olarak cast edilmiştir.
     }
}

// “||” ifadesinin sağında x otomatik olarak String’e cast edilmiştir.

if (x !is String || x.length == 0) return

// “&&” ifadesinin sağında x otomatik olarak String e cast edilmiştir.

if (x is String && x.length > 0) {
     print(x.length) ) // x String’e otomatik olarak cast edilmiştir.
}

Bu tip SmartCast ler When ve While yapılarında da yapılabilir.

when (x) {
     is Int -> print(x + 1)
     is String -> print(x.length + 1)
     is IntArray -> print(x.sum())
}

Eğer derleyici Casting e garanti veremiyorsa Casting gerçekleşmez. Herhangi bir Exception olmaması için Safe (Nullable) cast operatörü kullanılır. as? yapısıdır.

val x: String? = y as? String

Kaynak : 

Bu yazı https://kotlinlang.org/docs/reference/  ve https://news.realm.io/news/droidcon-michael-pardo-kotlin/ Kaynaklarından faydalanılarak hazırlanmıştır.

Blog yazılarına abone olmak ister misiniz ?

Her yeni blog yazısı çıktığında veya soru yayınlandığında bildirim almak için e-mail adresinizi yazmanız yeterli.