Open12
[Kotlin] memo

const
const val PI = 3.14
fun main() {
...
Javaで言うところのstatic final ...
constはclass外スコープで宣言する。
インスタンスではなく、クラスで固有な定数となる。
クラスに一つだけ生成される変数なので、メモリの使用量が抑えられる?

trimIndent()
fun main() {
var hello = """
How %s
are
you?
""".trimIndent()
println(hello.format("Ana"))
}
formatで引数(%s)を取れる

when
Switchと同様
fun main() {
val age = 18
when (age) {
in 0..12 -> println("kids")
in 13..18 -> println("Teenager")
else -> println("nothing")
}
}

配列
固定長
fun main() {
val array: Array<Int> = arrayOf(10, 20, 30)
val intArray = intArrayOf(40, 50, 60)
val doubleArray = doubleArrayOf(70.0, 80.0, 90.0)
val nullArray = arrayOfNulls<String>(5)
array.forEach { println(it) }
}

List
可変長
順番の概念を持つ
fun main() {
val list1 = listOf(10, 20, 30)
val list2 = mutableListOf(10, 20, 30)
// 変更
list2[0] = 100
// 追加
list2.add(0, 200)
// 削除
list2.removeAt(0)
list2.remove(30)
}

Set
可変長
順番の概念がなく、要素の重複を許可しない
fun main() {
val set1 = setOf(10, 20, 30)
val set2 = mutableSetOf(10, 20, 30)
// 追加
set2.add(40)
// 重複は許可されないので40が複数登録されない
set2.add(40)
// 削除
set2.remove(10)
}

Map
可変長
key: valueペア。keyは重複しない。
fun main() {
val map1 = mapOf("orange" to "オレンジ", "apple" to "アップル")
val map2 = mutableMapOf("orange" to "オレンジ", "apple" to "アップル")
// 変更
map2["apple"] = "りんご"
// 追加
map2["banana"] = "バナナ"
// 削除
map2.remove("orange")
}

for
fun main() {
for (i in 1..5) println(i)
for (i in 5 downTo 1) println(i)
for (i in 1..10 step 2) println(i)
val brand = "Brand"
// 順番逆転
for (i in brand.reversed()) println(i)
}

While
fun main() {
var number = 1
while (number <= 5) {
println(number)
number++
}
}

do while
fun main() {
var i = 0
do {
println(i)
i++
} while (i <= 10)
}

continue break outer
fun main() {
// break (5回でloop抜ける)
for (i in 0..10) {
if (i == 5) break
println(i)
}
// continue (偶数は実行される)
for (i in 0..10) {
if (i % 2 == 0) continue
println(i)
}
// ネストされたforをouterで抜ける
outer@ for (i in 0..10) {
for (j in 0..10) {
if (j == 5) break@outer
print(j)
}
println()
}
}

関数
fun main() {
val returnValue = unionString("Hello", "world")
println(returnValue)
}
fun unionString(str1: String, str2: String) = "$str1 $str2"
可変長引数
fun main() {
val intArray = intArrayOf(1, 2, 3, 4, 5)
// スプレッド演算子*
println(union(*intArray))
}
fun union(vararg array: Int): String {
var str = ""
for (num in array) str += num
return str
}
デフォルト引数・名前付き引数
fun main() {
calcSquareArea(width = 10)
}
fun calcSquareArea(height: Int = 5, width: Int) = height * width
戻り値を複数返す(Pair, Triple)
fun main() {
val intArray = intArrayOf(10, 20, 30, 40, 50)
val (sum, max) = sunMax(*intArray)
println(sum)
println(max)
// or
// val pair: Pair<String, String> = sunMax(*intArray)
// println(pair.first)
// println(pair.second)
}
fun sunMax(vararg array: Int): Pair<Int, Int> {
var sum = 0
var max = 0
for (num in array) {
sum += num
if (max < num) {
max = num
}
}
return Pair(sum, max)
}
高階関数(::)
fun main() {
// 高階関数として扱う
val hoFunc = ::calcA
}
fun calcA(a: Int, b: Int) = a + b
ラムダ式・無名関数
無名関数は返り値の型を指定できる
fun main() {
// ラムダ式
val lambda = calcB(10, 20) { x: Int, y: Int -> x + y }
println(value)
// 無名関数
val anonymousFunction = calcB(10, 20, fun(x: Int, y: Int): Int = x + y)
}
fun calcB(num1: Int, num2: Int, func: (Int, Int) -> Int) = func(num1, num2)