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")
}