Улучшения языка в выпуске Kotlin 1.4

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

Одна из интересных вещей, о которых я хочу упомянуть, - это онлайн-мероприятие Kotlin, которое состоялось 12 октября. Записи мероприятия доступны на официальном канале YouTube JetBrains или на веб-сайте Kotlin.

Вы найдете подробные технические обсуждения последних обновлений новых функций, таких как библиотека kotlinx.dateTime, улучшений в отладке сопрограмм, kotlinx.serialization, а также мультиплатформенной и серверной разработки.

Без лишних слов, давайте начнем с новых функций, представленных в Kotlin 1.4.

Конверсии SAM

Преобразование одного абстрактного метода (SAM) - это не что иное, как возможность передавать лямбда-выражение или вызываемую ссылку, когда ожидается интерфейс SAM. До Kotlin 1.4 мы могли применять преобразования SAM только к интерфейсам Java.

Если вы попытаетесь сделать это на интерфейсах Kotlin, возникнет исключение: Используйте типы функций. Начиная с версии 1.4, мы также можем использовать его на интерфейсах Kotlin; нам нужно добавить модификатор fun перед ключевым словом interface, чтобы он заработал. Посмотри:

Многие люди очень давно просили эту функцию. Из-за множества запросов на исправление они ввели функциональные интерфейсы. Причина введения функционального интерфейса заключается в том, что намерения должны быть явными. Это означает, что если вы хотите, чтобы интерфейс имел преобразование SAM, сделайте его явным, добавив ключевое слово fun.

Явный режим API

Kotlin - очень удобный язык с множеством удобных функций; Мне нравится, что нам не нужно явно указывать тип возвращаемого значения функций.

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

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

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

Завершающая запятая

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

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

Прервать и продолжить внутри блока «когда»

Блок Kotlin when - революционная функция. Это одна из наиболее часто используемых функций в моем опыте работы с Kotlin. Один из недостатков заключается в том, что когда мы пытаемся использовать ключевое слово break или continue внутри блока when, возникает ошибка: Break и continue не допускаются в операторах when.

Один из способов обхода этой ошибки - использовать ярлыки, посмотрите:

Kotlin 1.4 разрешает break и continue в when операторах внутри циклов без каких-либо меток. Посмотри:

Смешивание именованных и позиционных аргументов

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

drawCustomView( height = 30, width = 30, color = Color.GREEN )

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

drawCustomView( height = 30, width = 30, Color.GREEN )

Улучшения в соглашениях об именах

Функции «max», «min»

Попытка использовать функции max и min в пустом списке всегда давала null результат, начиная с Kotlin 1.0, что не является ожидаемым результатом с учетом соглашений об именах. Суффикс orNull уместен.

По мере развития Kotlin такое соглашение об именах несовместимо с их философией. В Kotlin 1.4 все изменилось: были добавлены две новые функции, maxOrNull и minOrNull, а старые функции max и min устарели.

‘OrNull’ функции

Стандартная библиотека содержит два набора функций: обычные и соответствующие функции с суффиксом orNull. Например, toInt - это обычная функция, а toIntOrNull - соответствующая функция.

Разница в том, что обычные групповые функции возвращают ненулевое значение или генерируют исключение, если что-то пойдет не так, например, когда строку невозможно преобразовать в целое число. Напротив, суффиксные OrNull функции возвращают null, если что-то пошло не так.

В Kotlin 1.4 добавлена ​​новая функция orNull, то есть функция randomOrNull. Он дает случайный результат или null, когда что-то пойдет не так. Это может быть полезно, если вы хотите выбрать случайное число из списка.

«OnEach» и «onEachIndexed»

onEach и onEachIndexed представлены в Kotlin 1.4; forEach выполняет указанное действие с каждым элементом, тогда как onEach выполняет указанное действие с каждым элементом и впоследствии возвращает саму коллекцию.

Вы можете использовать onEach и onEachIndexed в середине цепочки вызовов.

«Уменьшить» и «бегатьСокращение»

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

Общая функция reduce возвращает окончательный результат, тогда как runningReduce возвращает все промежуточные шаги. В этом разница между reduce и его runningReduce аналогом. Аналогичная функция под названием runningFold была добавлена ​​к функциональности сворачивания. Взгляните на следующую диаграмму, чтобы лучше понять:

Ссылка

Чтобы узнать больше о Kotlin 1.4, перейдите по следующим ссылкам:



Бонус

Чтобы узнать больше о Kotlin, прочтите предыдущие части этой серии «Расширенное программирование с Kotlin»: