1. 基本的なコードスニペット
忙しい人や、Kotlinの雰囲気を知りたい人のためにKotlinの基本的な書き方のスニペットを集めました。
1-1. パッケージとインポート
package testpackage
fun testprint() {
println("test print.")
}
import testpackage.*
fun main(args: Array) {
testprint()
}
1-2. 関数
fun main(args: Array) {
println("${add(10, 100)}")
println("${sub(5, 20)}")
printHello()
printAdd(20, 30)
}
// fun 関数名(仮引数: 型): 返り値の型
fun add(a: Int, b: Int): Int {
return a + b
}
// 関数が単独の式のみで構成される場合、{}が不要で、返り値は省略しても推定される
fun sub(a: Int, b: Int) = a - b
// 返り値なしは Unit
fun printHello(): Unit {
println("Hello!")
}
// Unitは省略可能
fun printAdd(a: Int, b: Int) {
println("$a + $b = ${a + b}")
}
110
-15
Hello!
20 + 30 = 50
1-3. 変数
val PI = 3.141592 // トップレベル定数
var topLevel = 100 // トップレベル変数
fun main(args: Array) {
// 定数(val)
val const1: Int = 100 // 定数
val const2 = 123.45 // 宣言時に代入する場合、方は推定されるため省略可能
val const3: String // 定数の宣言だけして、値の代入はあとですることも可能
const3 = "constStr"
println("const1 = $const1")
println("const2 = $const2")
println("const3 = $const3")
// 変数(var)
var num = 10 // 変数
num += 10
println("num = $num")
// トップレベル
println("PI = $PI")
incrimentTopLevel()
incrimentTopLevel()
decrimentTopLevel()
println("topLevel = $topLevel")
}
fun incrimentTopLevel() {
topLevel++
}
fun decrimentTopLevel() {
topLevel--
}
const1 = 100
const2 = 123.45
const3 = constStr
num = 20
PI = 3.141592
topLevel = 101
1-4. コメント
JavaやJavaScriptのコメントと変わりありませんが、ブロックコメントのネストが可能です
// 行末までコメント
/*
ブロックコメント
*/
/*
ブロックコメントは
/*
ネスト可能です
*/
*/
1-5. ストリングテンプレート
文字列の中に、任意の変数や式の値を埋め込む事ができます。書き方はLinuxっぽいですね
fun main(args: Array) {
var realNum = 123.4
// 単独の変数や定数の前に$をつける
val realNumStr1 = "realNum = $realNum"
// 任意の式を${}で囲う
val realNumStr2 = "realNum * 2 = ${realNum * 2}"
println(realNumStr1)
println(realNumStr2)
}
realNum = 123.4
realNum * 2 = 246.8
1-6. 条件分岐(if)
いわゆるif文です。switchはKotlinにはありません。
fun main(args: Array) {
val a = 123.4
val b = 987.6
println("max of (a, b) is ${max(a, b)}")
println("min of (a, b) is ${min(a, b)}")
rangeCheck(3, 2, 5)
}
fun max(a: Double, b:Double): Double {
if (a > b) {
return a
} else {
return b
}
}
fun min(a: Double, b: Double): Double {
// それぞれの式が一つだけの場合は次のように記述することできる
return if (a < b) a else b
}
fun rangeCheck(x: Int, min: Int, max: Int) {
// レンジとif文の組み合わせて使う
if (x in min..max) {
println("$x is between $min to $max.")
} else {
println("$x is out of range.")
}
}
max of (a, b) is 987.6
min of (a, b) is 123.4
3 is between 2 to 5.
1-7. 条件分岐(when)
fun main(args: Array) {
parseToInt("Two")
val obj1 = 15
val obj2 = 123.45
println("$obj1 is ${describe(15)}")
println("$obj2 is ${describe(123.45)}")
}
fun parseToInt(str: String): Int? {
// いわゆるswitchのような使い方ができます
var num: Int? = null
when (str) {
"One" -> {
num = 1
println("This is $num.")
}
"Two" -> {
num = 2
println("This is $num.")
}
else -> {
println("invalid String.")
}
}
return num
}
fun describe(obj: Any): String =
// このように柔軟な条件を追加することができ、
// ifと同じように単独の式であれば値を返すことができます
when (obj) {
"some string" -> "some string"
10 -> "Ten"
is Double -> "Double"
in 11..20 -> "between 11 to 20"
1, 2 -> "One or Two"
else -> "Unknown"
}
This is 2.
15 is between 11 to 20
123.45 is Double
1-8. 繰り返し(for)
fun main(args: Array) {
val studentList = listOf("鈴木太郎", "山田花子", "佐藤一郎")
// コレクション
for (student in studentList) {
println(student)
}
println("-------------------")
// レンジ
for (x in 1..5) {
println(x)
}
println("-------------------")
for (x in 1..10 step 3) {
println(x)
}
println("-------------------")
for (x in 15 downTo 0 step 4) {
println(x)
}
}
1-9. コレクション
fun main(args: Array) {
val studentList = listOf("鈴木太郎", "山田花子", "佐藤一郎")
// コレクションを繰り返しで使う
for (student in studentList) {
println(student)
}
// コレクションを条件分岐で使う
if ("鈴木太郎" in studentList) {
println("鈴木太郎は生徒の一人です")
}
}
鈴木太郎
山田花子
佐藤一郎
鈴木太郎は生徒の一人です
1-10. nullableとnull-safety
型の後ろに?をつけると、nullable(値がnullである可能性がある)となります。
逆に言えば、型の後ろに?が着いていないものは絶対にnullではありません。
nullableの場合、nullであると問題の発生するコードはビルド時にエラーになります。
(Javaの場合、nullチェックそしていないなどの問題があることが実行時にならないとわかりませんでした)
その為、null-safetyなプログラミングが可能です。
fun main(args: Array) {
printAdd1("10", "20")
printAdd2("100", "23")
printAdd1("ten", "20")
}
fun parseToInt(str: String): Int? {
return str.toIntOrNull()
}
fun printAdd1(numStr1: String, numStr2: String) {
val num1 = parseToInt(numStr1)
val num2 = parseToInt(numStr2)
// Int?であるnum1やnum2はnullの可能性があるため、
// そのままnum1 * num2のように計算することはできない
// println(num1 * num2) // これはビルドエラー
// 次のようにnullチェックをすると、自動的にInt?からIntに変換される
if (num1 != null && num2 != null) {
println(num1 + num2)
} else {
println("num1 or num2 is null.")
}
}
fun printAdd2(numStr1: String, numStr2: String) {
val num1 = parseToInt(numStr1)
var num2 = parseToInt(numStr2)
// 次のように記述してもOKです
if (num1 == null) {
println("num1 is null.")
return
}
if (num2 == null) {
println("num2 is null.")
return
}
println(num1 + num2)
}
30
123
num1 or num2 is null.
1-11. 型チェックとキャスト
fun main(args: Array) {
println(parseToInt("100"))
println(parseToInt(100))
println(parseToInt("hundred"))
}
fun parseToInt(obj: Any): Double? {
// is演算子で型のチェックをしてtrueだった場合、自動的にチェックした型にキャストされる
if (obj is String) {
// Stringにキャストされているので toDoubleOrNull を呼べる
return obj.toDoubleOrNull()
} else if (obj is Int) {
// Intにキャストされているので toDouble を呼べる
return obj.toDouble()
} else {
return null
}
}
100.0
100.0
null