Рубріки: Теория

Введение в язык программирования Kotlin: особенности и преимущества

Андрей Галадей

На сегодняшний день существует уйма языков программирования (ЯП) — от старых и заслуженных, вроде C/C++, до современных и модных, таких как Kotlin. Казалось бы, можно создать один язык, который будет универсальным для всех задач. Но в реальности разные языки используются для разных задач, потому что так эффективнее. И сегодня речь пойдет об одном из современных ЯП и круге его применения, своеобразном апгрейде для Java — Kotlin.

Содержание:

1. Kotlin и основные сведения о нем
2. История возникновения, мотивация создания
3. Зачем понадобился еще один языковой стандарт вместо Java?
4. Преимущества и недостатки Kotlin
5. Синтаксис
6. Примеры кода
7. Перспективы языка Kotlin
Вывод

1. Kotlin и основные сведения о нем

Языку программирования Kotlin всего несколько лет. Разработкой занимается компания JetBrains, а сам язык позиционируется в качестве вполне успешной альтернативы Java и Scala.

Kotlin — современный, статически типизированный и один из самых быстроразвивающихся языков программирования, который позволяет разрабатывать приложения под мобильные системы — iOS и Android, веб-приложения, серверные и кроссплатформенные решения.

Но это не просто еще один язык, а целая полноценная экосистема. Она включает в себя сам язык, базовый инструментарий и библиотеки. Этот набор называется Common Kotlin. Отметим, что в комплект также входят расширения для языка под конкретные платформы. Это, к примеру, Kotlin/JVM, Kotlin/JS и Kotlin/Native. А еще — специфические для платформы библиотеки, инструменты и так далее. Предполагается, что в будущем все эти элементы войдут в состав Kotlin Multiplatform.

2. История возникновения, мотивация создания

Разработка Kotlin началась недавно, а именно, в 2010 году под руководством Андрея Бреслава. Несколько лет проект находился в стадии альфа и бета, а первая релизная версия была показана на конференции разработчиков Google I/O 2017. Сам язык изначально создавался для работы в рамках виртуальной машины Java Virtual Machine.

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

В языке используются заимствования синтаксических конструкций из JavaScript, Pascal, TypeScript, Haxe, PL/SQL, F#, Go и Scala, C++, Java, C#, Rust и D. Новый язык должен быть быстрее, чем Java и проще, чем Scala, но при этом не терять их преимуществ.

Важный аспект, что язык развивается как opensource-проект, исходный код проекта доступен в открытом репозитории.

3. Зачем понадобился еще один языковой стандарт вместо Java?

На этот вопрос есть два ответа. Официальная версия звучит так — после запуска языка, в 2017 году компания Google сделала его приоритетным языком на Android, утвердив его как стандарт. На такой шаг там пошли из-за того, что уже в 2017-ом де-факто около миллиона программистов использовали именно Kotlin.

Также есть неофициальная версия — Google до сих пор судится с Oracle по поводу использования Java в операционной системе Android. Похоже, что отсюда же «растут уши» и новой системы Fuschia. С 2017 года поисковый гигант постепенно переводит всю Android -инфраструктуру с Java на Kotlin. Этим маневром Google, во-первых, сохраняет всю наработанную кодовую базу для Java (Kotlin совместим с Java), во-вторых, избавляется от самодурства Oracle, которая в последнее время чудит с Java, вставляя палки в колеса конкурентам.

Помимо этой корпоративной возни, есть и объективные причины. Kotlin создает более компактный и защищенный код. Следует отметить, что есть чисто практические задачи, которые куда лучше решаются в рамках Kotlin. Суть в том, что есть куча языков:

  • Java — это основный язык, который реализует большинство логики приложения.
  • Язык разметки XML — используется для работы и конфигурирования библиотек.
  • HTML — применяется для разработки фронтенда приложения.
  • SQL или аналоги — для работы с базами данных, запросами и так далее.
  • JavaScript — для веб-интерфейса.
  • CSS — для оформления. Тоже язык разметки со своим специфическим синтаксисом (хоть и довольно простым).

И главная проблема здесь в том, что это разные языки, которые приходится с помощью «костылей» объединять в единое целое. У них разный синтаксис и особенности, логика и архитектура. Именно эти проблемы решает Kotlin, который объединяет лучшие аспекты всех систем в одно целое.

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

4. Преимущества и недостатки Kotlin

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

Примерно это выглядит так:

thecode.media

Еще одним плюсом можно назвать выразительность языка Kotlin. В нем избыточность синтаксиса сведена к минимуму.

Вот пример Hello world на Java и на Kotlin:

thecode.media

А вот так выглядит простая программа на Java и на Kotlin соответственно:

В простых программах у Kotlin проще синтаксис и меньше вспомогательных конструкций:

thecode.media

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

Помимо этого, обратим внимание на безопасность языка. Сама среда программирования и язык выпущены одной компанией, которая централизованно исправляет ошибки и уязвимости. Также при компиляции срабатывает null-защита, так что вручную обрабатывать знаменитую уязвимость NullPointerException из Java не нужно.

Разумеется, есть и недостатки. Одним из них называют непредсказуемую скорость компиляции. А быстродействие готовой программы может незначительно уступать Java из-за виртуальной машины JVM.

5. Синтаксис

Как уже сказано выше, синтаксические конструкции языка во многом заимствованы из других языков. Здесь мы приведем примеры того, как можно объявить те или иные конструкции.

Во-многом это похоже на Java, говоря лингвистически — это его близкий диалект.

Переменные

Чтобы объявить переменную, используем var.

var username: String = "some user name"
Чтобы объявить константу, используйте val. val в Kotlin — это как final в Java.
val API_DELAY_CONSTANT: Int = 100

Инициализация переменной как null производится с помощью оператора “?”. Если этот оператор не указан, то компилятор не даст возможности присвоить переменной значение null.

var myString: String? = null

Для определения статической переменной используем companion object. А для отложенной инициализации переменной — lateInit:

lateinit var user: User                 // Initialized later in code
lateinit var items: List<String>   // Initialized later in code

Условные выражения

Начнем с условного выражения if.

Kotlin позволяет использовать его разными способами. Один из вариантов идентичен тому, что есть в в Java:

if (x > 0) {
    println("x больше чем 0")
} else {
    println("x меньше чем 0")
}

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

Пример:

val max = if (a > b) {
    print("возвращаем a")
    a
  }
  else {
    print("возвращаем b")
    b
  }

Каждая условная ветвь возвращает значение, указанное в последней строке. Поэтому ключевое слово return использовать не нужно.

Функции

Так выглядит простая функция в Kotlin:

fun getNumber(): Int {
    return 1
}

Функция getNumber() имеет область видимости public, не имеет параметров и возвращает Int. Есть также вариант private с параметрами. Выглядит так:

private fun getStringLength(str1: String, str2: String): Int {
    return str1.length + str2.length
}

Функция getStringLength() имеет область видимости private и два параметра, возвращает Int.

Статическая функция выглядит так:

class MyStringUtil {
       companion object {
        fun getOddLengthString(str: String): String? {
            if (str.length % 2 == 0) return null
           return str
        }
    }
}var str: String = MyStringUtil.getOddLengthString("hey")

Здесь getOddLengthString() принимает параметр и возвращает строку. Тип String указан с символом “?”, то есть функция может возвращать значение null.

Циклы for, while, when

В цикле for для Kotlin используется ключевое слово in, которое дает доступ к элементам коллекции:

var items: List<String> = ArrayList<String>()

for (item in items) {
    // do something with item
}

Аналогично в цикле for:

for (index in items.indices) {
    // access items using index
    // items.get(index)
}

Цикл while в Kotlin такой же, как и в Java:

var i: Int = 0// Some while loop
do {
    // do something
    i++
} while (i < 5)// Another while loop
while (i < 10) {
    // do something
    i++
}

Для оператора же switch есть отличия. Если в Java использовался только этот оператор, то в Kotlin использует when для переключения между условиями:

// A cool example of when statement
fun describe(obj: Any): String? {
    var res: String? = null
    when (obj) {
        1 -> { res = "One" }         // if obj == 1
        "Hello" -> res ="Greeting"  // if obj == "Hello"
        is Long -> "Long"            // if obj is of type Long
        !is String -> "Not string"   // if obj is not of type String
        else -> {
            // execute this block of code
        }
    }
    
    return res
}

Null Safety (Null безопасность)

В Java, чтобы избежать исключения NullPointerException, используется блок “if”. А вот в Kotlin его можно пропустить.

Код в Java:

if (person != null && person.department != null) {
    person.department.head = managersPool.getManager()
}

Код в Kotlin:

// If either `person` or `person.department` is null, the function is not called:
person?.department?.head = managersPool.getManager()

В коде используется оператор безопасного вызова “?.”, который позволяет избегать NullPointerException. Также можно использовать “?:”. Он называется Elvis operator и позволяет обрабатывать варианты, когда объект равен null.

Например:

var name = person?.name ?: throw InvalidDataException("Person cannot be null.")

Классы (конструкторы, методы, наследования)

Для наследования класса использует ключевое слово open. Если его нет, то класс аналогичен final в Java, то есть, его нельзя наследовать.

Пример:

open class Animal {
    // This class is open and
    // can be inherited    
}
class Dog : Animal() {  // Notice the paranthesis
    // Class dog is final and
    // can't be inherited
}// Compiler throws error
class Labrador : Dog {
}

Singleton (синглтоны)

В Kotlin они реализуются с помощью ключевого слова object (в Java это class).

Пример:

object Singleton {
    var name: String = "singleton object"

    fun printName() {
        println(name)
    }
}// later in the code
Singleton.name
Singleton.printName()

Интерфейсы

Вот так выглядит пример базового интерфейса в Kotlin:

interface Named {
    fun bar()
}
interface Person : Named { // Person inherits Named
    fun foo()
}
class Employee() : Person {
    override fun bar() {
        // do something
    }
    override fun foo() {
        // do something
    }
}

А так выглядит передача интерфейса функции:

// A function that accepts and interface as a parameter
private fun setEventListener(listener: EventListener) {
    // do something
}// Passing an interface to the function
setEventListener(object : EventListener{
    override fun call() {
        // do something
    }
})

Type Casts (приведение типов)

Для проверки, является ли объект экземпляром определенного класса, можно задействовать операторы “is” и “!is”.

if (obj is String) {
    print(obj.length)
}
if (obj !is String) {
    print("Not a String")
}

Предотвращаем исключения с помощью оператора безопасного приведения “as?”, который возвращает null при сбое. Это называется безопасным привидением или safe typecast.

Выглядит так:

val x: String? = y as? String

В этом случае выбрасывания исключений не будет.

Обработка исключений

Выбрасывание и обработка исключений практически такие же, как и в Java.

throw Exception("Hi There!")try {
    // some code
}
catch (e: SomeException) {
    // handler
}
finally {
    // optional finally block
}

6. Примеры кода

Давайте теперь посмотрим на пример кода небольшой программы.

fun main(){
    println("Hello Kotlin")
}

При запуске она выведет типичное «Hello Kotlin».

Примеры более сложных математических задач приведены ниже.

Gradle зависимость:

repositories {
  maven { url 'https://jitpack.io' }
}
 dependencies {
  implementation 'com.github.thomasnield:kotlin-statistics:-SNAPSHOT'
}

Линейная регрессия

Пример линейной регрессии c применением Kotlin-statistics:

fun main() {
  val r = sequenceOf(
      1.0 to 3.0,
      2.0 to 6.0,
      3.0 to 9.0,
      4.0 to 11.8
  ).simpleRegression()

  println(r.slope)           // 2.9400000000000004
  println(r.meanSquareError) // 0.006000000000000227
  println(r.predict(5.0)).   // 14.8
}

Байесовская классификация

Пример классификации при помощи Наивного байесовского классификатора:

 import org.nield.kotlinstatistics.toNaiveBayesClassifier
  class Email(val message: String, val isSpam: Boolean)
 fun main() {
     val emails = listOf(
         Email("Hey! If you really want to enlarge your ML scores click here", isSpam = true),
         Email("Earn 50 more points for ML just by visiting this site!", isSpam = true),
         Email("Still have F grade? Professional help with ML right here", isSpam = true),
 
         Email("Hey, I left my phone at home. Email me if you need anything.", isSpam = false),
         Email("Stay At Home: COVID-19 news", isSpam = false),
         Email("Please see attachment for notes on today's meeting.", isSpam = false),
         Email("JetBrains license certificate", isSpam = false),
         Email("Your Education Pack expires soon ", isSpam = false)
     )
     val nbc = emails.toNaiveBayesClassifier(
         featuresSelector = { it.message.splitWords().toSet() },
         categorySelector = { it.isSpam }
     )
      val spamInput = "your grade is still so bad, but I can help you to get more scores".splitWords().toSet()
     require(nbc.predict(spamInput) == true) { spamInput }
      val legitInput = "Thank you for placing the order ".splitWords().toSet()
     require(nbc.predict(legitInput) == false) { legitInput }
 }
 fun String.splitWords(): Sequence<String> = this.split(Regex("\\s"))
     .asSequence()
     .map { it.replace(Regex("[^A-Za-z]"), "") }
     .map { it.toLowerCase() }
     .filter { it.isNotEmpty() }

Пример работы с регулярными выражениями:

fun main(args: Array<String>) {
    //regex
    val month = "(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)"
    fun getPattern(): String = """\d{2}\h$month\h\d{4}"""
    val regex = Regex(getPattern())
    val str ="12 DEC 1996"
    val flag = regex.containsMatchIn(str)
    if (flag)
        println("{$str} is true!")
    else
        println("{$str} is wrong!")
    
    //null
    val listWithNulls: List<String?> = listOf("A", null, "B", "ERROR 404", null)
    for (item in listWithNulls) {
         item?.let  {println(it)}  ?: println("element is empty") 
    }
}

7. Перспективы языка Kotlin

Судя по всему, у этого языка весьма неплохие перспективы. Его развитие идет активно, он поддерживается Google (что само по себе удивительно, ведь это сторонний коммерческий продукт), все больше программистов выбирают его для работы. Таким образом, есть шансы, что эта разработка рано или поздно станет стандартом де-факто для мобильных приложений.

Вывод

Мы рассмотрели основы языка Kotlin, его базовый синтаксис и возможности. Само собой, для тщательного изучения нужно читать документацию и гуглить материалы. Кое-что можно почерпнуть и из видео-примеров ниже:

Останні статті

Обучение Power BI – какие онлайн курсы аналитики выбрать

Сегодня мы поговорим о том, как выбрать лучшие курсы Power BI в Украине, особенно для…

13.01.2024

Work.ua назвал самые конкурентные вакансии в IТ за 2023 год

В 2023 году во всех крупнейших регионах конкуренция за вакансию выросла на 5–12%. Не исключением…

08.12.2023

Украинская IT-рекрутерка создала бесплатный трекер поиска работы

Unicorn Hunter/Talent Manager Лина Калиш создала бесплатный трекер поиска работы в Notion, систематизирующий все этапы…

07.12.2023

Mate academy отправит работников в 10-дневный оплачиваемый отпуск

Edtech-стартап Mate academy принял решение отправить своих работников в десятидневный отпуск – с 25 декабря…

07.12.2023

Переписки, фото, история браузера: киевский программист зарабатывал на шпионаже

Служба безопасности Украины задержала в Киеве 46-летнего программиста, который за деньги устанавливал шпионские программы и…

07.12.2023

Как вырасти до сеньйора? Девелопер создал популярную подборку на Github

IT-специалист Джордан Катлер создал и выложил на Github подборку разнообразных ресурсов, которые помогут достичь уровня…

07.12.2023