JavaとKotlinの比較
これからKotlinを始めるJavaプログラマ向けの記事です。 説明は最小限としています。 JavaをKotlinに置換する場合、どう記述するのかを 見ながら覚えていきましょう。
基本構文
変数
public static void main(String args[]) { int a; a = 1; final int b = 2; System.out.println("a = " + a + "b = " + b); }
- kotlin
fun main(args: Array<String>) { var a: Int // varは後から変更可能。 a = 1 val b = 2 // valは後から変更不可。型推論で型省略可。 println("a = $a, b = $b") }
変数 - Optional
public static void main(String args[]) { String s = null; if (s != null) { System.out.println(s); } s = "not null" // Optionalを使った場合 Optional.ofNullable(s).ifPresent(System.out::println); }
- kotlin
fun main(args: Array<String>) { var s: String? = null if (s != null) { println(s) } s = "not null" // sがnullで無い時にprintlnを実行。 // ラムダ式の引数が一つ場合、省略した形式の「it」で参照できる s?.let { println(it) } }
if式
public static void main(String args[]) { int a = 1; int b = 2; String result; if (a < b) { result = "結果:aはbより小さい"; } else { result = "結果:aはbより大きい"; } System.out.println(result); }
int a = 1; int b = 2; String result = a < b ? "結果:aはbより小さい" : "結果:aはbより大きい"
- Kotlin
fun main(args: Array<String>) { val a = 1 val b = 2 val result = if (a < b) "結果:aはbより小さい" else "結果: aはbより大きい" println(result) }
[Point!] Kotlinには三項演算子がないので、以下のようにif式で代用する。
[Point!] String Templates ( $a の形式で変数 a の値を文字列に埋め込み可能)
when式
public static void main(String args[]) { int value = 1; String result = null; switch (value) { case 0: result = "0 です"; break; case 1: result = "1 です"; break; default: result = "その他 です"; break; } System.out.println(result); }
- Kotlin
fun main(args: Array<String>) { val value = 1 val result = when(value) { 0 -> "0 です" 1 -> "1 です" else -> "その他 です" } println(result) }
when式 - Javaでswitch+if文を用いるケース
*Java
public static void main(String args[]) { String value1 = "grape"; String value2 = "cake"; String result = null; switch (value1) { case "apple": result = "appleです"; break; case "banana": result = "bananaです"; break; default: if (value2.equals("cake") { result = "cakeです"; } else { result = "その他の食べ物です"; } break; } System.out.println(result) }
- Kotlin
fun main(args: Array<String>) { val value1 = "grape"; val value2 = "cake"; val result = when { value1 == "apple" -> "appleです" value1 == "banana" -> "bananaです" value2 == "cake" -> "cakeです" else -> "その他の食べ物です" } println(result) }
method
引数なし、戻り値なし
private void print() { System.out.println("print"); } public static void main(String args[]) { print() }
- Kotlin
private fun print() { println("print") } fun main(args: Array<String>) { print() }
[Point!] 式が1つだけの場合は{}を省略可能。戻り値の型も省略できます。
- Kotlin
private fun print(): Unit = println("print") fun main(args: Array<String>) { print() }
引数2つ、戻り値なし
private void addition(int a, int b) { int result = a + b; System.out.println("答え:" + result); } public static void main(String args[]) { addition(1, 2) }
- Kotlin
private fun addition(a: Int, b: Int) { val result = a + b println(result) } fun main(args: Array<String>) { addition(1, 2) }
引数2つ、戻り値あり
private void multiplication(int a, int b) { return a * b; } public static void main(String args[]) { int result = multiplication(2, 3) System.out.println(result); }
- Kotlin
private fun multiplication(a: Int, b: Int): Int { return a * b } fun main(args: Array<String>) { val result = multiplication(2, 3) println(result) }
[Point!] 式が1つだけの場合は{}を省略可能。
- Kotlin
private fun multiplication(a: Int, b: Int): Int = a * b fun main(args: Array<String>) { println(multiplication(2, 3)) }
[Point!] さらに戻り値の型も型推論によって省略可能。
- Kotlin
private fun multiplication(a: Int, b: Int) = a * b fun main(args: Array<String>) { println(multiplication(3, 4)) }
戻り値複数
class Pair { private String key; private int value; Pair(String key, int value) { this.key = key; this.value = value; } String getKey() { return key; } int getValue() { return key; } } class Main { private Pair getPairValue() { // 2つ以上の値は返却できないので自作のクラス型で返す Pair pair = new Pair("age", 30); return pair; } public static void main(String args[]) { Pair pair = getPairValue(); System.out.println(pair.getKey() + ":" pair.getValue()); } }
- Kotlin
// KotlinのPairクラスを使用 private fun getPairValue(): Pair<String, Int> = Pair("age", 30) fun main(args: Array<String>) { val pair = getPairValue() println("${pair.first} : ${pair.second}") // このように変数として受け取ることも可能 var (key, value) = pair println("key=$key, value=$value") }