👨‍🍳 Готовим вкусный код в Котлине 🍴 - Часть 2

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

Пропустили первую серию? Хорошо, вот это, если хочешь взглянуть 👇.



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

⭐️ Строковые шаблоны

  • Kotlin предоставляет строковые шаблоны для выполнения различных операций со строкой.
  • Используя его, мы можем упростить наш код и сделать его еще более читаемым и легко отслеживаемым.
  • Например, см. Это 👇

Здесь вы можете видеть, что нам не нужно + для объединения в строки. Вместо этого мы можем напрямую включать типы, используя $, которые заменяют значение этой переменной. Смотрите сейчас 👇

Нам пришлось заключить строку в двойные кавычки. Например, "name": "John Doe". Если вы видите здесь удаленный код (🔴), нам нужно использовать \" для включения двойных кавычек в строку, и тогда ее будет трудно прочитать или отследить до кого-то еще.

Помните, как мы объединяли несколько или многострочные строки в Java? Тогда действительно непросто отследить код. Взгляните на этот фрагмент 👇

Вы заметили простоту😃? В Kotlin мы легко обрабатывали многострочную строку с помощью """. Нам даже не нужно добавлять \n.

Строковые литералы (скажем, специальные символы, такие как \n) не обрабатываются в шаблонах, потому что на самом деле вам это не понадобится. Он полностью рассматривается как необработанная строка.

Со строками в Котлине мы можем сделать еще много.

⭐️ Уничтожение деклараций

  • Kotlin позволяет нам разложить объект на несколько переменных. Например, см. Это 👇

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

Но подождите, это будет опасно ⚠️, если вы измените порядок участников. Скажем, если вы напишете код как 👇

val (userName, userId) = getUsers()

Затем вы можете видеть, что идентификатор пользователя будет назначен для userName, а имя будет назначено для userId. Так что обращайтесь с этим осторожно или просто используйте его, когда уверены, что структура класса больше не изменится. Например, Kotlin предоставляет класс с именем Pair<A,B>, который является частью стандартной библиотечной функции. Pair имеет только два члена, то есть first и second. Итак, здесь мы уверены, что его структура не изменится, тогда мы с уверенностью можем использовать там деструктивные объявления 👇.

Если вам не нужна никакая переменная, вы можете сделать это следующим образом 👇

val (_, interests) = getUserInterest()

⭐️ Запечатанный класс

  • Как следует из названия, запечатанные классы представляют собой ограниченные иерархии классов.
  • Проще говоря, запечатанные классы - это расширенные перечисления.
  • Запечатанный класс может иметь подклассы, но все они должны быть объявлены в том же файле, что и сам запечатанный класс.
  • Например, см. Это 👇

Хорошо, в первом фрагменте у нас есть два класса для результата, то есть Success и Failure. Мы уверены, что getResult() вернет только экземпляр этих двух классов. Тем не менее, если вы видите when{} выражение, нам нужно добавить else{} блок без необходимости, потому что код не уверен в типе экземпляра val result.

Теперь посмотрим на второй фрагмент, мы объявили эти классы в sealed class Result {}, и это сильно упростило. Совершенно очевидно, что Result может иметь только два типа экземпляров: Success или Failure.

Мы также можем читать члены экземпляров, см. Это 👇

Как вы можете видеть выше, мы действительно можем получить доступ к someData из Успех и message из Неудача. Вот как это работает 😃. Это действительно идеальный вариант для замены перечислениями.

⭐️ Внутренний класс

  • Как получить доступ к значению внешнего класса во вложенных классах? Допустим, вы хотите получить доступ к this области класса из вложенного класса. Не волнуйтесь, внутренний класс в Kotlin здесь, чтобы вам помочь 😃.
  • См. Это в первую очередь 👇

Есть класс Outer, в котором есть два вложенных класса: Inner1 и Inner2 . Как видите, Inner1 не может получить доступ ❌ к value внешнего класса, а Inner2, который объявлен с помощью ключевого слова inner, может получить к нему доступ ✅.

Обратите внимание: в main (),

Если вы видите №1, мы можем напрямую создать экземпляр Inner1 и получить доступ к его члену.

Теперь посмотрим # 2, мы можем создать экземпляр Inner2 только с помощью экземпляра Outer, поскольку он несет ссылку на объект класса Outer.

⭐️ Функциональный (SAM) интерфейс

  • Функциональный интерфейс должен иметь только один абстрактный метод, то есть S AM (Single Abstract Method).
  • Используя функциональные интерфейсы, мы можем использовать преобразования SAM, которые помогают сделать наш код более кратким и читаемым с помощью лямбда-выражений.
  • Функциональный интерфейс может иметь более одного не абстрактного члена, но у них должен быть ровно один абстрактный метод.
  • См. Пример ниже, он не требует пояснений 👇

Как видите, если мы не используем преобразование SAM, нам нужно писать код с использованием object выражений. Просто добавив ключевое слово fun для интерфейса, мы буквально сделали код еще более читабельным 😃. Разве это не мило? 🍫

⭐️ Лямбда-выражения

  • Это самая острая особенность Котлина 🌶️.
  • Это как анонимные функции, и мы можем рассматривать их как значения.
  • Вы можете использовать лямбда-выражения, если хотите создать функцию, которая не обязательно должна быть интерфейсом (как мы видели преобразования SAM). Например, см. Этот 👇. Здесь фактически не нужно объявлять fun interface.

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

⭐️ Функции высшего порядка

  • Лямбда - это анонимная функция. Она становится функцией высшего порядка, когда принимает функции как параметры или возвращает функцию.
  • Например, см. Этот пример 👇

Здесь onClick() принимает функцию как параметр, который выполняется при нажатии кнопки.

Вы помните функции области видимости из предыдущей части? Ага! let{}, apply{} и т. Д. Функции области видимости являются HOF стандартной библиотеки Kotlin.

Теперь посмотрим на этот пример 👇

Здесь мы создали HOF TextBuilder, который имеет параметр builder, который дает ссылку на StringBuilder в лямбде. Вот почему мы можем вызывать свойства StringBuilder с помощью this области.

Чем больше вы исследуете Lambas и HOF, тем больше вы влюбитесь ❤️ в Kotlin.

⭐️ Делегаты

  • Этот красивый язык позволяет использовать шаблон Delegated в коде 😍.
  • Kotlin изначально предоставляет его без использования шаблонов.
  • Взгляните на этот пример 👇

Здесь предложение by в списке супертипов для SportsBike и SportsCar указывает, что bike и car будут храниться внутри объектов этих классов, и компилятор сгенерирует все методы Vehicle что жду v.

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

⭐️ Делегирование собственности

  • Мы можем применять делегирование для свойств или членов.
  • Нам не нужно реализовывать одно и то же снова и снова, используя это.
  • Например, в стандартной библиотеке Kotlin есть делегаты свойств, такие как lazy, observables и т. Д. См. Это 👇

Здесь мы использовали ленивый делегат, где значение вычисляется только при первом доступе. Как видите, когда мы обращались к value в println () в первый раз, сообщение отображается, а в следующий раз - нет.

Посмотрим, как создавать собственные делегации. Сначала посмотрите этот пример 👇

В первом фрагменте, как видите, мы написали повторяющийся код для форматирования полей, но он сильно упростился после добавления делегатов. Мы переопределяем setValue() и getValue() операторные функции ReadWriteProperty. Чтобы узнать больше о делегатах в Котлине, обратитесь к this.

⭐️ Диапазоны

  • В Kotlin мы можем легко вычислять задачи, связанные с диапазоном, с гораздо большей удобочитаемостью.
  • Оператор .. используется в виде диапазона. См. Примеры ниже 👇

Как видите, код не требует пояснений и не требует явного объяснения. Мы также можем добавить поддержку диапазонов для пользовательских типов классов, переопределив rangeTo() функцию.

⭐️ Расширения коллекции

  • Стандартная библиотека Kotlin обладает «сокровищем функций расширения для коллекций».
  • С помощью этих функций можно решать сложные проблемы простыми решениями. Это также упрощает отслеживание кода, делает его кратким и читаемым. Например, посмотрите этот код 👇

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

С этими расширениями мы можем сделать гораздо больше. Чем больше вы его исследуете, тем он будет вам интересен 👓.

⭐️ Сопрограммы

  • Самая и самая ГОРЯЧАЯ 🔥 тема в Kotlin - это Coroutine 😍.
  • Это позволяет нам чисто писать асинхронную и неблокирующую логику. Он обеспечивает структурированный параллелизм 🔀.

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

Мы также можем избежать традиционных обратных вызовов, используя сопрограммы. Kotlin предоставляет suspend fun для записи блокирующих вызовов.

В приведенном выше примере вы можете увидеть, как упрощается код с использованием сопрограмм.

Хотите еще раз увидеть красоту сопрограмм? Допустим, вам нужно делать две вещи одновременно, как это сделать? Здесь на помощь приходит async. Смотрите это 👇

Здесь вы можете видеть, что две сопрограммы выполняются одновременно. async возвращает Deferred, то есть облегченное неблокирующее будущее, которое представляет собой обещание предоставить результат позже.

Библиотека сопрограмм содержит другие API, такие как Flow для реализации реактивного подхода, Channel для связи и многие другие. Сопрограммы - одна из ОГРОМНЫХ тем в Котлине. Чем больше вы его исследуете, тем интереснее будет вам 😍. См. Эту ссылку для получения дополнительной информации.

Ага! 😍. Объединив все эти ингредиенты вместе, мы приготовили вкусный код с Kotlin 😋. Надеюсь, вам понравилась эта статья.

Если вам понравилась эта статья, поделитесь ею со всеми! 😄

Поделиться - это забота!

Спасибо! 😃

Эта статья была представлена ​​в информационных бюллетенях AndroidWeekly и KotlinWeekly.

Большое спасибо Шалом Халберт и Ришит Дагли за то, что помогли мне сделать это лучше :)