Stand: 2017-03-25

Java-Kotlin-Spickzettel

Java und Kotlin mit Code-Beispielen im direkten Vergleich nebeneinander

Inhalt

Anwendung definieren

JavaKotlin
public class MyApplication {
    public static void main(String... args) {
        ...
    }
}
fun main(args: Array<String>) {
    ...
}

In Kotlin können Funktionen direkt auf Paketebene, also außhalb einer Klasse oder eines Objekts, definiert werden. Deshalb ist für die main-Methode auch keine nutzlose Klasse erforderlich.

Text ausgeben

JavaKotlin
System.out.println("Hallo Welt!");
println("Hallo Welt!")

Variablen und Werte definieren

JavaKotlin
int x = 5;
var x: Int = 5
var x = 5
final int y = 1;
val y: Int = 1
val y = 1

Variablen in Strings

JavaKotlin
String message = 
        String.format("a: %s, x: %s", a, b.x);
        
String message = "a: " + a + "x: " + b.x;
val message = "a: $a, x: ${b.x}"

In Kotlin können Variablen mit vorangestelltem $ direkt in Strings eingebettet werden; komplexe Ausdrücke wie b.x benötigen zusätzlich geschweifte Klammern.

Dokumentation: String Templates

Collections

JavaKotlin
String[] array = { "a", "b", "c"};
val array = arrayOf("a", "b", "c")
final List<String> list = 
    Arrays.asList("a", "b", "c");
val list = mutableListOf("a", "b", "c")
String item = list.get(1);
val item = list[1]
list.set(0, "x");
list[0] = "x"
Set<String> set = new HashSet<>();
set.add("a");
set.add("b");
val set = mutableSetOf("a", "b")
Map<String, Integer> map = new HashMap<>();
map.put("a", 1);
map.put("b", 2);
val map = mutableMapOf("a" to 1, "b" to 2)
Integer a = map.get("a");
val a = map["a"]
map.put("a", 9);
map["a"] = 9
Map<String, Integer> map = new HashMap<>();
map.put("a", 1);
map.put("b", 2);
Map<String, Integer> unmodifiableMap = 
    Collections.unmodifiableMap(map);
val unmodifiableMap = mapOf("a" to 1, "b" to 2)

Dokumentation: Collections

Streams

JavaKotlin
list.stream()
    .filter(it -> it.length() == 1)
    .map(String::toUpperCase)
    .collect(Collectors.toSet());
list
    .filter { it.length == 1 }
    .map(String::toUpperCase)
list.stream()
    .collect(Collectors.joining(", "));
list.joinToString(", ")
positions.stream()
    .mapToInt(Position::price)
    .sum();
list.sumBy { it.price }

Weitere Beispiele bei Stackoverflow.com

Bedingungen mit if

JavaKotlin
final String filename;
if (!args.isEmpty())
    filename = args.get(0);
else
    filename = "default.txt"
val filename = 
    if (!args.isEmpty) args[0] 
    else "default.txt"
String a = x < 1 ? "red" : "green";
val a = if (x < 1) "red" else "green"

Dokumentation: if

for-Schleife

JavaKotlin
for (MyItem item : collection) { ... }
for (item in collection) { ... }
for (int i = 0; i < array.size; i++) {
    System.out.println(array[i]);
}
for (i in array.indices) {
    println(array[i])
}
for (int i = 1; i <= 10; i++) {
    System.out.println(i);
}
for (i in 1..10) {
    println(i)
}

Dokumentation: for

Schlüssel-Wert-Paare einer Map durchlaufen

JavaKotlin
for (Map.Entry<K,V> entry : map.entrySet()) {
  K key = entry.getKey();
  V value = entry.getValue();
  ...
}
for ((key, value) in map) {
   ... 
}

// oder
map.forEach { (key, value) -> ... }

Durch sogenannte “desctructuring declarations”, kann in Kotlin ein Map-Eintrag in Schlüssel und Wert zerlegt werden.

switch und when

JavaKotlin
  final Color color;
  switch (value) {
    case 0:
      color = Color.RED;
      break;
    case 1:
    case 2:
      color = Color.YELLOW;
      break;
    case 3:
      color = Color.GREEN;
      break;
    default:
    color = Color.GREY;
  }
val color = when(value) {
    0 -> Color.RED
    1, 2 -> Color.YELLOW
    3 -> Color.GREEN
    else -> Color.GREY
}