2017年6月21日水曜日

Kotlinを思い出すためのサンプルソース

(2017/06/21)
↑今回から日付を入れます。

仕事ではあまり触れる機会が少ないKotlin。
JavaやPHPの後だと忘れがちなんでそのまま実行できるような
Kotlin思い出す用のソースを貼っておきます。
あとで綺麗に見えるように編集するかも。→しました(2017/06/22。ただしKotlinには対応してないんでハイライトがない。。。)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
fun main(args: Array<String>) { // ←JVM言語ですが、このように一番外枠がClassでなくても大丈夫。Ptyhonのモジュールのような考え方です。
 
 
 
    // Javaと相互互換を保証しています。ので、Javaの資産がそのまま使えます。またこのファイルのメソッドなどもJavaから呼び出せます。
 
    println(java.sql.Timestamp.valueOf("2013-10-11 12:13:4"))
 
    System.out.println("Javaによるsysout")
 
 
 
    // (アドレスが)変更できない変数の宣言は「val」(Javaで言う所のfinal)
 
    val str: String = "Hello, World!"
 
    val num: Int = 5 // プリミティブはない。IntとかLongとか。Javaでいうラッパーを使用する。ここらへんもPythonに近いですね。
 
 
 
    // 3項演算子の代わりにこんな文法がある
 
    val res = if (num.equals(5)) {
 
        "Hi, Tom!"
 
    } else {
 
        "Hi, Bob!"
 
    }
 
 
 
    println(str + num.toString())
 
    println(res)
 
 
 
    // (アドレスが)変更できる変数の宣言は「var」。Kotlinでは可能な限り「val」を使うことを推奨
 
    var str2: String = "test"
 
    str2 = "test2"
 
    println("str2:" + str2)
 
    val str3: String = "test"
 
    // str3 = "test3" ←これはコンパイルエラー。リテラルはアドレスが別になるため。
 
    // str3 = str3 + str2 ←よってこれもコンパイルエラー。StringBuilderのように使う場合はvarを使用する。
 
    str2 += "abcd"
 
    println("文字列の変更。test2 + abcd = " + str2)
 
 
 
    // 型の変換は変換元のメソッドで行う
 
    val int1: Int = "123".toInt()
 
    val int2 = int1 * 10
 
    println(int2.toString())
 
    //Int.parseInt("123") ←こんなメソッドはない
 
 
 
    // Switchはなくて、whenを使う
 
    val color: String = "青"
 
    val piyo = when (color) {
 
        "青" -> "blue"
 
        "赤" -> "red"
 
        else -> "other"
 
    }
 
    println(piyo)
 
 
 
 
 
    // (中身を)変更できないリスト。Pythonで言う所のタプル。
 
    // (豆知識)Pythonでも可能な限りリストではなくタプルを推奨してますよね。
 
    println("変更できないリスト")
 
    val list: List<String> = listOf("1", "2", "5")
 
    // list.add("5") ←変更できないリストなのでaddメソッドは存在しない
 
    for (value1 in list) {
 
        println(value1)
 
    }
 
 
 
    // (中身を)変更できるリスト。Pythonで言う所のリスト
 
    println("変更できるリスト。宣言は「val」なところに注目。この場合はアドレスが変わらないという意味")
 
    // JavaでfinalのListにもaddはできますよね
 
    val mutableList: MutableList<Int> = mutableListOf(9, 8, 7, 6, 5)
 
    mutableList.add(4)
 
    for (value1 in mutableList) {
 
        println(value1)
 
    }
 
 
 
    // JavaのObjectにあたるクラスはAnyです
 
    val any1: Any = "This is Any."
 
    val any2: Any = 123 // Javaと違ってプリミティブがないのでこんな書き方になる。Javaなら「Object any2 = new Integer(123);」とか。
 
    println(any1.toString())
 
    println(any2.toString())
 
 
 
    // クラスの使い方。Kotlinでは「new」は不要
 
    val carol = Car(price = 1000000, speed = 250, name = "キャロル")
 
    println("name:" + carol.name) // ←実はこれはフィールド(値)を直接参照しているのではなく、プロパティ(getter)の呼び出しです
 
    // メソッド呼び出し
 
    carol.displayInfo()
 
 
 
    // Try-Catch
 
    try {
 
        throw Exception("try-catch")
 
 
 
    } catch (e: Exception) {
 
        println("Error Message:" + e.message)
 
    }
 
 
 
    // ラムダ
 
    val sum: (Int, Int) -> Int = { x, y -> x + y }
 
    println("ラムダの処理結果→" + sum(1, 2))
 
 
 
    // 匿名関数
 
    val sum2 = fun(a: Int, b: Int): Int {
 
        return a + b
 
    }
 
    println("匿名関数の処理結果→" + sum2(1, 2))
 
 
 
    // 2つの結果を戻してくれる関数。Javaに欲しかったですよね。
 
    val pair = carol.addNumbers(2, 3)
 
    println("2つの結果を返してくれる関数 ひとつめ→" + pair.first + " ふたつめ→" + pair.second)
 
 
 
    // プライマリコンストラクタの動き
 
    val cb400sf = Bike("CB400SF", 200, 800000)
 
    println("プライマリコンストラクタで設定されたもの→" + cb400sf.name + "," + cb400sf.maxSpeed + ",\\" + cb400sf.price)
 
 
 
    // filterの使い方。trueの要素だけ返す
 
    val filterSample = arrayOf(1, 2, 3).filter { num -> num != 2 }
 
    print("filterの使い方→")
 
    for (x in filterSample) {
 
        print(x.toString() + " ")
 
    }
 
    println()
 
 
 
    // filterNotにすると逆になる
 
    val filterNotSample = arrayOf(1, 2, 3).filterNot { num -> num != 2 }
 
    print("filterNotの使い方→")
 
    for (x in filterNotSample) {
 
        print(x.toString() + " ")
 
    }
 
    println()
 
 
 
    // forEach
 
    println("ListのforEachはJava8と同じ雰囲気で。")
 
    listOf(1, 2, 3).forEach { x -> println(x + 1) }
 
    // リスト系は他にもMaxとかMinとかDistinctとか便利なのがたくさんある。リファレンスは見たほうがいいです。
 
 
 
    // Stringの便利な機能やメソッド
 
   println("Stringの便利な機能やメソッド")
 
    val a = 2
 
    val b = 3
 
    // もうformatメソッドは必要ありません
 
    println("$a + $b = ${a + b}") // 2 + 3 = 5
 
    // ヒアドキュメントも使えます
 
    val hereDoc = """
 
<html>
 
    <body>
 
        $a + $b = ${a + b}
 
    </body>
 
</html>
 
"""
 
    println(hereDoc)
 
 
 
 
 
    // Kotlinはnull safetyです。
 
    // 基本的にNull Pointer Exceptionは発生しません。(Javaで定義したメソッドの使い方によってはそれでも起こるけど)
 
    // 普通の変数にnullを代入しようとするとコンパイルエラーになります
 
    // val nullDesu: String = null ←コンパイルエラー
 
    // nullが入り得る場合は明示的に下記のようにしなければいけません
 
    val nullDesu: String? = null
 
    // println(nullDesu.length) ←わざとぬるぽ起こそうとしてもコンパイルエラー。nullが入り得る変数で危険なことはできない仕様です
 
    if (nullDesu != null) {
 
        println(nullDesu.length) // nullチェックをするとコンパイルが通ります
 
    }
 
 
 
    // 既存のクラスに機能を追加できる「Extension」という機能
 
    // 今回はStringクラスに機能追加しちゃいます
 
    fun String.addShimasu(x: Int): String {
 
        return this + x.toString()
 
    }
 
    println("これがExtensionです!!!".addShimasu(123456))
 
 
 
}
 
 
 
// クラスの書き方(Javaっぽく) 
 
// ちなみにデフォルトだとclassはpublic finalです。
 
// また、staticの概念はないです
 
class Car {
 
    // getterやsetterは記載不要です。
 
    // 変数名がgetter、setterとして外部と連携します。
 
    // 直接に値(フィールド)にアクセスするのではないので、これらは「フィールド」ではなく「プロパティ」と呼びます。
 
    // 要はJavaで言う所のメンバ変数をprivateで宣言してgetter, setterを用意した状態と同じで、メンバ変数名でgetter, setterが使用できるということです。
 
    val price: Int
 
    val speed: Int
 
    val name: String
 
 
 
    constructor(price: Int, speed: Int, name: String) {
 
        this.price = price
 
        this.speed = speed
 
        this.name = name
 
    }
 
 
 
    // 何も返さない時はvoidではなくUnit型
 
    fun displayInfo(): Unit {
 
        println("クラスのメソッド呼び出し↓")
 
        println("Name:" + this.name)
 
        println("MaxSpeed:" + this.speed)
 
        println("Price:" + this.price)
 
        return
 
    }
 
 
 
    // 複数の値を返せる関数
 
    fun addNumbers(a: Int, b: Int): Pair<Int, Int> {
 
        return Pair(a + 1, b + 1)
 
    }
 
}
 
 
 
// クラスのプライマリコンストラクタの書き方(Kotlinっぽい)
 
class Bike(name: String, maxSpeed: Int, price: Int) {
 
    val name = name
 
    val maxSpeed = maxSpeed
 
    val price = price
 
}

0 件のコメント:

コメントを投稿