Статьи

Введение в Котлин

С тех пор как Apple выпустила язык программирования Swift для iOS, многие разработчики Android хотели подобный язык для разработки Android. Если вы один из тех разработчиков, вы полюбите Kotlin, язык JVM, который очень похож на Swift.

Kotlin — это язык статической типизации, разработанный JetBrains, синтаксис которого более выразителен и лаконичен, чем у Java. Благодаря таким функциям, как функции высшего порядка, лямбда-выражения, перегрузка операторов, строковые шаблоны и многое другое, Kotlin может предложить гораздо больше, чем Java. Поскольку Java и Kotlin хорошо взаимодействуют друг с другом, их можно использовать вместе в одном проекте.

Если вы компетентный программист на Java, вы сможете выучить Kotlin за очень короткое время. В этом уроке я покажу вам, как использовать наиболее часто используемые конструкции Kotlin.

Чтобы следовать за мной, вам понадобится:

Чтобы создать класс в Kotlin, вы должны использовать ключевое слово class . Например, вот как вы создаете пустой класс с именем Person :

« `Java-класс Person {

} « `

Класс обычно имеет свойства и функции-члены (также называемые методами). Давайте добавим два свойства в класс Person , имя типа String и возраст типа Int .

java var name: String = "" var age: Int = 0

Как видите, синтаксис для создания переменных немного отличается от синтаксиса Java. Чтобы создать переменную в Kotlin, вы должны использовать ключевое слово var . Однако, если вы хотите, чтобы ваша переменная была переменной только для чтения / назначения один раз, используйте вместо этого ключевое слово val .

Ради нулевой безопасности Котлин также проводит различие между переменными, которые могут быть null и переменными, которые никогда не могут быть null . В нашем предыдущем примере переменные name и age никогда не могут быть null . Если они нулевые, компилятор выдаст ошибку.

Чтобы создать переменную, которая может содержать null , вам нужно добавить ? после типа переменной. Например:

java var college: String? = null

Теперь, когда у нас есть класс, создать его экземпляр легко:

java var jake = Person()

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

java jake.name = "Jake Hill" jake.age = 24 jake.college = "Stephen's College"

Инициализация отдельных свойств нашего экземпляра, как мы это сделали, не является хорошей практикой кодирования. Лучший способ сделать это — использовать конструктор. Синтаксис Котлина для создания такого конструктора очень компактен:

« `Java-класс Person (имя переменной: строка, переменная возраст: Int, колледж var: строка?) {

} « `

На самом деле, если вам больше нечего добавить в свой класс, вам не нужны фигурные скобки. Следующий код работает просто отлично:

« `java класс Person (имя переменной: строка, переменная возраст: Int, школа колледжа: строка?)

var jake = Person («Джейк Хилл», 24 года, «Колледж Стивена») « `

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

Чтобы добавить больше конструкторов в ваш класс, известный как вторичные конструкторы, вы должны использовать ключевое слово constructor . Вторичные конструкторы должны делегироваться первичному конструктору, используя ключевое слово this . Давайте добавим вторичный конструктор в наш класс, который инициализирует значение свойства с именем email :

« `Java-класс Person (имя переменной: строка, переменная возраст: Int, колледж var: строка?) {

Чтобы создать экземпляр с использованием вторичного конструктора, вы пишете что-то вроде этого:

java var jake = Person("Jake Hill", 24, "Stephen's College", "jake.hill@example.com")

В Kotlin функции создаются с помощью ключевого слова fun . Давайте добавим простую функцию-член с именем isElitableToVote, которая возвращает Boolean значение:

« `java fun isElitableToVote (): Boolean {// Если возраст больше или равен 18 // вернуть true

Обратите внимание, что тип возвращаемого значения указывается в конце заголовка функции. Вы можете вызвать этот метод так же, как в Java:

java jake.isEligibleToVote()

Kotlin позволяет расширять класс, добавляя в него дополнительные функции без изменения его исходного определения. Такие функции известны как расширения. Именам этих функций должны предшествовать имена классов, которые они расширяют.

Например, чтобы добавить расширение с именем isTeenager в класс Person , вы пишете следующий код вне класса:

« `java fun Person.isTeenager (): Boolean {

Эта функция особенно полезна, когда вы хотите расширить классы, которые не принадлежат к базе кода вашего проекта. Например, следующий фрагмент кода добавляет расширение containsSpaces к классу String :

java fun String.containsSpaces(): Boolean { return this.indexOf(" ")!=-1 }

При создании производного класса важно помнить следующее:

  • Вы должны использовать : вместо ключевого слова extends в Java.
  • Заголовок базового класса должен иметь open аннотацию.
  • Если ваш базовый класс имеет конструктор, который принимает параметры, ваш производный класс должен инициализировать эти параметры в самом заголовке.

Давайте создадим класс с именем Employee, который наследуется от Person :

« `java открытый класс Person (переменное имя: String, var age: Int, var колледж: String?) {…}

класс Employee (имя: строка, возраст: Int, колледж: String ?, var company: String): Person (имя, возраст, колледж) {

} « `

В Kotlin вы должны явно указать, что функцию-член можно переопределить, используя open аннотацию в заголовке метода в базовом классе. В производном классе открытые функции могут быть переопределены с помощью аннотации override .

Например, чтобы переопределить метод isEligibleToVote , добавьте следующий фрагмент кода в класс Employee :

java override fun isEligibleToVote(): Boolean { // Always return true return true }

Котлин не позволяет создавать статические методы. Тем не менее, он позволяет вам создавать функции уровня пакета, которые не принадлежат ни одному классу.

main метод, пожалуй, самый известный статический метод. Если вы хотите добавить метод main в пакет с именем com.tutsplus.code.tutorial , то ваш код будет выглядеть следующим образом:

« `Java-пакет com.tutsplus.code.tutorial

веселая главная (args: Array ) {

} « `

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

Если функция возвращает значение одного выражения, вы можете использовать оператор = после заголовка функции, за которым следует выражение, чтобы определить функцию.

Например, чтобы добавить метод к классу Person который возвращает true если это восьмидесятилетний человек , вы должны написать:

java fun isOctogenarian(): Boolean = age in 80 .. 89

Как видите, этот сокращенный синтаксис более компактен и читаем.

Функции высшего порядка — это функции, которые могут возвращать функции или принимать функции в качестве параметров. С другой стороны, лямбда-выражение — это просто функция, у которой нет имени. Обычно лямбда-выражения и функции более высокого порядка используются вместе.

Рассмотрим следующий пример, демонстрирующий синтаксис лямбда-выражения:

java {x, y -> x+y}

Это простое лямбда-выражение, которое принимает два параметра, x и y , и возвращает их сумму. Как вы уже догадались, параметры функции перечислены перед оператором -> а тело функции начинается после оператора -> . Это лямбда-выражение может быть присвоено переменной и использовано следующим образом:

java val sumLambda: (Int, Int) -> Int = {x,y -> x+y} val actualSum = sumLambda(3,4)

Обратите внимание, что тип переменной, которая содержит лямбда-выражение, определяет типы ее параметров и возвращаемое значение.

Создать функцию более высокого порядка, которая может принимать лямбда-выражение выше в качестве параметра, так же просто. Например, чтобы создать функцию, которая удваивает результат лямбда-выражения, вы должны написать:

java fun doubleTheResult(x:Int, y:Int, f:(Int, Int)->Int): Int { return f(x,y) * 2 }

Вы можете вызвать эту функцию следующим образом:

java val result1 = doubleTheResult(3, 4, sumLambda)

Кроме того, вы можете передать лямбда-выражение непосредственно в функцию более высокого порядка:

java val result2 = doubleTheResult(3, 4, {x,y -> x+y})

Лямбда-выражения часто используются с массивами. Например, рассмотрим следующий массив значений Int :

java val numbers:Array<Int> = arrayOf(1, 2, 3, 4, 5)

Если вы хотите возвести в квадрат значение каждого элемента в массиве, вы можете использовать функцию map вместе с лямбда-выражением следующим образом:

« `java val squaredNumbers = numbers.map ({x -> x * x})

// Результатом будет новый массив, содержащий // 1, 4, 9, 16, 25 « `

Выражения диапазона очень часто используются в Kotlin. Вы уже использовали их при создании методов isTeenager и isOctogenarian .

Для создания диапазона все, что вам нужно, это оператор ..

« `java val r1 = 1..5

// Этот диапазон содержит числа 1, 2, 3, 4, 5 « `

Чтобы создать диапазон в порядке убывания, используйте функцию downTo .

« `java val r2 = 5 downTo 1

// Этот диапазон содержит числа 5, 4, 3, 2, 1 « `

Если вы не хотите, чтобы шаг был равен 1 , вы можете указать пользовательское значение, используя функцию step .

« `java val r3 = 5 downTo 1 шаг 2

// Этот диапазон содержит числа 5, 3, 1 « `

Вы увидите больше выражений диапазона позже в этом уроке.

В Kotlin if — это выражение, которое возвращает разные значения в зависимости от того, было ли выполнено условие. Следующий пример иллюстрирует, как это работает.

« `java var age = 20 val isElitableToVote = if (age> 18)« Yes »иначе« No »

// isElitableToVote теперь будет установлено в «Да» « `

Выражение when эквивалентно switch Java. Тем не менее, он намного более универсален. Например, рассмотрим следующий пример.

« `java val age = 17

val typeOfPerson = when (age) {0 -> «Новорожденный» в 1..12 -> «Ребенок» в 13..19 -> «Teenager» else -> «Adult»}

// typeOfPerson теперь будет иметь значение «Teenager» « `

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

В Kotlin вы можете использовать цикл for..in для for..in массивов, коллекций и всего остального, что обеспечивает итератор. Его синтаксис практически идентичен синтаксису Java, за исключением использования оператора in вместо оператора Java : В следующем примере показано, как перебрать массив объектов String .

« `java val names = arrayOf (« Джейк »,« Джилл »,« Эшли »,« Билл »)

for (имя в именах) {println (name)} « `

С помощью выражений диапазона вы можете заставить этот цикл вести себя как традиционный, в стиле C, цикл for .

« `Java для (я в 0..9) {println (я)}

// ведет себя точно так же, как // for (int i = 0; i <10; i ++) « `

Синтаксис циклов while и do..while while в Kotlin идентичен синтаксису, используемому в Java. Например, следующий код Kotlin зацикливается на массиве объектов String используя цикл while:

« `java val names = arrayOf (« Джейк »,« Джилл »,« Эшли »,« Билл ») var i = names.size ()

while (i> 0) {println (names [–i])} ​​« `

Kotlin позволяет встраивать переменные и выражения в строки, заключая их в пару фигурных скобок, с префиксом символа $ . Например:

« `java val name =« Bob »println (« Меня зовут $ {name} ») // Печатает« Меня зовут Боб »

val a = 10 val b = 20 println («сумма равна $ {a + b}») // печатает «сумма равна 30» « `

В этом уроке вы изучили основы языка программирования Kotlin. Несмотря на то, что мы рассмотрели несколько конструкций, у Kotlin есть много чего предложить. Фактически, по состоянию на июнь 2015 года, Kotlin все еще доступен только в качестве предварительного просмотра. Вероятно, в ближайшие месяцы появятся несколько улучшений и новых функций.

Если вы хотите узнать, как использовать Kotlin в Android Studio, взгляните на Как использовать Kotlin в ваших проектах Android . Чтобы узнать больше о языке Kotlin, я рекомендую посетить документацию Kotlin .