Полгода назад я собирался разобраться с массивами в Kotlin. Нельзя сказать, чтобы я разобрался, но у меня появилось несколько замечаний по этому поводу. Возьмем простейший код:

package ru.yamakarov.arrays

fun main(args: Array<String>) {
    val a = Array(10, { x: Int -> x + 1})
    for (i in a) {
        println(i)
    }
}

Удобно, что не надо писать оператор new, очень приятная мелочь. Не надо писать точек с запятой, и мы как бы не поражены раком точки с запятой. Тип массива выводится из возвращаемого значения функции инициализатора. Это очень классно придумано, не будет значений заполненных мусором. И не надо писать тип массива, он итак понятен, а значит, если я захочу поменять тим мне достаточно вы выражении возвращать другое значение. В этом примере еще более удобном менять тип массива, потому что и for и println принимают любые значения.

Я посмотрел во что это все превращается и сделал генерацию байткода и декомпиляцию:

public final class MainKt {
   public static final void main(@NotNull String[] args) {
      Intrinsics.checkParameterIsNotNull(args, "args");
      int size$iv = 10;
      Object[] result$iv = new String[size$iv];
      int i$iv = 0;

      for(int var5 = result$iv.length; i$iv < var5; ++i$iv) {
         String var11 = "";
         result$iv[i$iv] = var11;
      }

      String[] a = result$iv;
      i$iv = result$iv.length;

      for(int var13 = 0; var13 < i$iv; ++var13) {
         String i = a[var13];
         System.out.println(i);
      }

   }
}

Тут видно что используется Java массив String[]. Если поменять инициализатор на возвращение Int то будет использоваться Integer[]. Для того, чтобы работал int[] надо использовать IntArray.

Подводя итог, кажется что можно очень кратко писать и получать производительный код.