Kotlin vs. Java – Basic Syntax

Порой очень хочется рассказать как классно что-то писать на Kotlin и какой это гибкий язык, сочетающий в себе мощь и лаконичность одновременно. В данной статье проведём сравнение ключевых моментов синтаксиса Kotlin и Java что, возможно, заставит Java-разработчиков задуматься о переходе на Kotlin. Ну, если не о переходе, то хотя бы просто попробовать Котлин в действии точно захочется :) Особенно, учитывая то, что по кроссплатформенности он аналогичен Java, так как компилируется в такой же JVM-байткод. Хотя нет, не аналогичен. Kotlin ещё умеет компилироваться в JavaScript, так что в перспективе может добраться до веб-технологий и составить конкуренцию таким языкам как CoffeeScript/TypeScript/Dart и пр.

Таким образом, если вы цените своё время и качество выходного кода, а также устали от пережитков прошлого типа NPE и прочих радостей Java, то Kotlin — это то, к чему стоит присмотреться.

По тегу Kotlin-vs-Java в дальнейшем опубликуем ещё пару заметок на тему сравнения. А пока рассмотрим базовые отличия в синтаксисе данных языков.

Объявление переменных и констант

Переменная в Kotlin объявляется в помощью ключевого слова var, константа — val.
Во многих случаях при объявлении можно не указывать тип присваемого значения, он будет определён автоматически.
О точке с запятой с Котлином так же можно забыть. Они нужны лишь в редких случаях, когда несколько операторов перечислены на одной строке.

int a = 1;
final int b = 2;
final int[] intArray = new int[] {1,3,5};
// Variable types will be defined automatically
var a = 1
val b = 2
val intArray = arrayOf(1,3,5)

// You can define type explicitly
var c: Int = 3

// If variable might be {null}
var d: Int? = null

Объявление методов

Котлин необычайно гибок в плане способов объявления методов. Если в Java у вас нет особых вариантов как это сделать, то в Kotlin это можно сделать 3 основными способами.

boolean method1() {
	return true;
}
// Basic syntax
fun method1(): Boolean {
	return true
}

// Return type can be defined automatically for non-public methods
fun method2() {
	return true
}

// And finally, you can omit function body
fun method3() = true

Проверка на null

Данный момент, конечно, заслуживает отдельной статьи. Но если вкратце: всё очень удобно.
Достаточно взглянуть на сравнение:

if (bundle != null) {
	bundle.putInt("key", 123);
}
// Puts int
// or does nothing if {bundle} is {null}
bundle?.putInt("key", 123)

В примере выше константа bundle является nullable, поэтому в Java требуется явная проверка на null. В Котлине же после указания имени переменной/константы/функции можно написать оператор ?. и затем сразу вызывать нужный метод. Если bundle == null, то вся данная конструкция завершит выполнение и вернёт null. Если bundle != null, будет вызван метод putInt().

Ещё одна очень классная вещь — это elvis-оператор ?: — позволяет выполнять код только в случае если выражение слева от оператора равно null. Посмотрите пример:

final int res = method1();
if (res == null) {
	res = 111;
}
val res = method1() ?: 111

Более того, с elvis-оператором можно использовать даже return и throw:

Node parent = node.getParent();
if (parent == null) {
	return;
}
val parent = node.getParent() ?: return

Циклы

Циклы for так же отличаются в Котлине. Они лаконичны, удобны, и тоже заслуживают отдельной заметки.
while и do..while выглядят как обычно.

for (int i = 0; i <= 10; i++) {
	// ...
}
for (i in 0..10) {
	// ...
}

// Iteration through collections
for (item in array) {
	// item
}

// Iteration with an index
for (i in array.indices) {
	// array[i]
}

За подробным описанием обращайтесь к официальной документации и следите за обновлениями в нашем блоге.