Рубрики
Без рубрики

От Явы до Котлина за 20 минут

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

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

Как будет выглядеть их открытие Котлина ?

Сеанс моб-программирования с коллегами позволил мне немного понять это….

  • Покажи Мне Код!
  • Моб-программирование
  • Настройка Kotlin в проекте
  • Сказать Java, что @ParametersAreNonnullByDefault
  • Pinguescere: Конвертировать файл Java в файл Kotlin
  • PinGuesserTest: Конвертировать файл Java в файл Kotlin – и т.д исправления Мануэля
  • Библиотеки Kotlin standard
  • Заменить API Streams библиотекой Стандарт Котлина
  • Сделайте val, а не var
  • Быстро терпеть неудачу
  • Переход к более функциональному стилю
  • Список.сложить()
  • Продолжение?

Покажи Мне Код!

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

Налейте себе, пожалуйста, бесоин де Издание сообщества IntelliJ . Это бесплатно !

Например, в MacOS вы можете установить его с помощью $ brew установить intellij-идея-ce

Репозиторий находится ниже, и описанные коммиты присутствуют в этом запросе на извлечение//.

jmfayard/из явы в котлин

jmfayard/из явы в котлин

Итак, детектив, один из наших коллег успешно наблюдал за нашей целью, грабителем Робби. Мы последовали за ним на секретный склад, где, как мы предполагаем, должны были найти все украденные вещи. Дверь на этот склад заперта электронным кодовым замком. К сожалению, наш шпион не уверен насчет ПИН-кода, который он видел, когда Робби вводил его.

Клавиатура имеет следующую компоновку:

┌───┬───┬───┐
│ 1 │ 2 │ 3 │
├───┼───┼───┤
│ 4 │ 5 │ 6 │
├───┼───┼───┤
│ 7 │ 8 │ 9 │
└───┼───┼───┘
    │ 0 │
    └───┘

Он отметил PIN-код 1357, но также сказал, что возможно, что каждая из цифр, которые он видел, на самом деле может быть другой соседней цифрой (по горизонтали или вертикали, но не по диагонали). Например. вместо 1 это также может быть 2 или 4. И вместо 5 это также может быть…

Но сначала немного контекста.

Моб-программирование

Мои коллеги Сара и Пьер сейчас проводит со мной сеанс Программирование мобов .

Цель состоит в том, чтобы решить//ката сосны, наблюдаемую приблизительно//, в которой средне надежный шпион сообщает нам, что видел сосну 1357 . Но он не очень уверен в себе. Каждая цифра может быть вместо этого одним из ее соседей на цифровой клавиатуре. Таким образом, код может быть 1357 но также, например |/2357 г. или 1368.

Проект Java/Maven. Он содержит два файла: PinGuesser.java и PinGuesserTest.java |/. В проекте есть время компиляции и выполнения тестов, которое рассчитывается в секундах, а не в минутах, как во многих приложениях для Android. На мой взгляд, мне лучше как разработчику.

Мы используем плагин Code With Me от IntelliJ , чтобы мы могли заниматься программированием мобов.

У нас все хорошо: нам удалось решить ката, а затем реорганизовать его до удовлетворительного состояния.

Но у нас осталось 20 минут!

  • Сара//: видите, что нужно улучшить ? Пьер//: не слишком много, мне так показалось.
  • Я//: у нас осталось 20 минут, почему бы не переписать все на Котлин ? Сара//: О, я слышала о Котлине, но у меня никогда не было возможности попробовать его. Тем не менее, 20 минут, это выполнимо ?
  • Я//: Давайте начнем, посмотрим, что это даст !

Настройка Kotlin в проекте

  • Пьер : Ладно, я никогда в жизни не занимался Котлином. Скажи мне, что делать.
  • Moi : Действие IntelliJ a une Конвертировать файл Java в файл Kotlin . Это хороший способ начать работу !
  • Камушек : Ладно, я попробую !
  • Пьер//: IntelliJ говорит мне, что Kotlin не настроен в проекте. Он не ошибся ! Пьер//: как мне настроить Kotlin в проекте Maven ?
  • Я//: Я не знаю, я всегда использовал Gradle. Я//: пусть это сделает IntelliJ !
  • Мои : Прохождение, это эквивалентное действие
  • Инструменты > Котлин > Настройка Котлина в проекте Пьер|/: пойдем.
  • Камушек : Похоже, это сработало, файл pom.xml
  • была изменена. Пьер
  • : первый коммит

Сказать Java, что @ParametersAreNonnullByDefault

  • Я//: прежде чем я попробую конвертер Java -> Kotlin, есть один предварительный шаг. Как вы, возможно, слышали, Kotlin интегрирует управление недействительностью в свою систему типов. Но не Java, которая по умолчанию разрешает null//везде. Поэтому конвертер также разрешит//null//везде. Что технически правильно, но не то, что мы хотим. Сара//: но есть аннотации в Java, чтобы определить, разрешено ли значение null или нет, верно ? Я//: точно, и интересующая нас аннотация//@ParametersAreNonnullByDefault//из JSR 305. Она применяется ко всему пакету и сообщает, что по умолчанию параметры являются ненулевыми. Это прекрасно, именно так это работает в Котлине !
  • Мне//://фиксация
diff --git a/pom.xml b/pom.xml
     
+        
+            com.google.code.findbugs
+            jsr305
+            3.0.2
+        

+++ b/src/main/java/pin/package-info.java
@@ -0,0 +1,4 @@
+@ParametersAreNonnullByDefault
+package pin;
+
+import javax.annotation.ParametersAreNonnullByDefault;

Pinguescere: Конвертировать файл Java в файл Kotlin

  • Пьер//: я думаю, что теперь я могу открыть PinGuesser.java |/и возобновить действие Конвертировать файл Java в файл Kotlin ? Мвд : Правильно
  • Пьер : Видимо…. это сработало ? В любом случае есть файл
  • Пингвины.кт . Я//: как ты можешь убедиться, что это действительно сработало ? Сара
  • : Ты должен начать модульное тестирование. Пьер
  • : Ах да…
  • Камушек : Все в зеленом цвете ! Это безумие, я написал свой первый код на Kotlin, и с первого раза он не содержит ошибок.
  • Сара|/: Браво ! Петр//: остались испытания. Мы ведь тоже должны их преобразовать, верно ?
  • Я//: не обязательно, это тоже так работает. Java и Kotlin могут мирно сосуществовать в одном репозитории благодаря своей совместимости. Сара
  • : Хорошо, но это звучит весело, и я тоже хочу попробовать ! Пьер|/: я даю тебе клавиатуру сразу после этого//фиксации|/.

PinGuesserTest: Конвертировать файл Java в файл Kotlin – и т.д исправления Мануэля

  • Сара : так что я открываю PinGuesserTest.java |/и я выполняю действие... Как ее зовут? Pierre
  • : Конвертировать файл Java в файл Kotlin Сара//: поехали !
  • Сара//: теперь у меня есть файл Тест на пингвинов.кт
  • . При этом он содержит ошибки…
  • Камушек : На твоем месте я бы предложил оптимизировать импорт.
  • Сара//: Хорошо. Сара//: это сработало.
  • Я//: как вы видите, конвертер не идеален. Но я считаю, что это отличный инструмент для обучения, потому что он позволяет вам взять то, что вы уже знаете – Java – и преобразовать его в это что вы хотите узнать. Сара//: я запускаю модульные тесты по осознанию.
  • Сара//: у меня странные ошибки в jUnit.
  • Я//: я считаю, что понимаю сообщение об ошибке: туда Java методы static , Котлин использует методы определения данных в файле сопутствующий объект {…} |/из класса. В общем, это почти одно и то же, но там jUnit действительно хочет иметь дело со статическими методами, что можно исправить с помощью аннотации:
-        fun testSingleDigitParameters(): Stream {
+        @JvmStatic fun testSingleDigitParameters(): Stream {
             return Stream.of(
                 Arguments.of("1", java.util.Set.of("1", "2", "4")),
                 Arguments.of("2", java.util.Set.of("1", "2", "3", "5")),
@@ -61,7 +58,7 @@ internal class PinGuesserTest {
             )
         }

-        fun invalidParams(): Stream {
+        @JvmStatic  fun invalidParams(): Stream {
             return Stream.of(
                 Arguments.of("   "),
                 Arguments.of("A"),

  • Сара : Тесты на зеленый цвет!
  • Сара|/: как и было обещано, проект сейчас находится на 100% в Котлине Сара
  • : совершило

Библиотеки Kotlin standard

  • Пьер//: что дальше ? Я//: можно создать//List
  • , Набор и Map |/как это традиционно делается на Java. Но стандартный книжный магазин Kotlin содержит множество служебных функций, которые элегантно решают небольшие, распространенные проблемы. Я покажу вам это:
  • Я//: Я предпочитаю именно так. Тесты все еще остаются зелеными? Я//: Да, они есть, поэтому//commit|/.

Заменить API Streams библиотекой Стандарт Котлина

  • Я//: еще одна вещь, содержащаяся в стандартной библиотеке Kotlin, – это функции|/. map () , .фильтр ()|/,//. flatmap () – и многие другие-которые можно найти на функциональных языках. Сара//: можно ли использовать API stream (), который мы использовали в Java ? Я//: это так, но более эффективно в своей реализации и менее многословно:
-    fun combineSolutions(pins1: Set, pins2: Set): Set {
-        return pins1.stream()
-            .flatMap { pin1: String ->
-                pins2
-                    .stream()
-                    .map { pin2: String -> pin1 + pin2 }
-            .collect(Collectors.toSet())
-    }

+    fun combineSolutions(pins1: Set, pins2: Set): Set =
+        pins1.flatMap { pin1 ->
+            pins2.map { pin2 ->
+                "$pin1$pin2"
+             }
+        }.toSet()
  • Сара//: тесты всегда проходят. Сара//:
  • совершить//.

Сделайте val, а не var

  • Мои : Данс ле код идиоматики Котлина, на эссе об использовании ле плюс возможные варианты вал собственности вместо вар собственности .
  • Пьер : В чем разница ?
  • Мой : значение свойства доступно только для чтения, иль не для того, чтобы задавать параметры, это самое подходящее/| последнее поле в Java Петр
  • : понятно. Поэтому я просто заменяю их |/ВАР//не с//Валь|/? Я : Да, это так. Камень|/: Легко. Пьер//://коммит|/.

Быстро терпеть неудачу

  • Сара//: есть ли в Котлине идиоматический способ проверки параметров ? Сара//: ожидается, что сосна будет чем-то вроде
  • 7294 , то есть они содержат только цифры. Я : Да, вы можете использовать |/require (условие) {“сообщение об ошибке”}//.
  • Сара : Что бы это дало здесь ?
fun getPINs(observedPin: String): Set {
    require(observedPin.all { it in '0'..'9' }) { "PIN $observedPin is invalid" }
    // rest goes here
}
  • Сара//: Спасибо ! Сара//:
  • совершить//.

Переход к более функциональному стилю

  • Сара : Каков следующий шаг ?
  • Я//: я хотел бы освободить функции. Петр//: то есть ?
  • Я : Смотри, у нас есть этот класс
  • Пингессер|/. Но что именно она делает? Она не делает ничего, кроме как быть чудовищем пространства имен. Я//: этот класс//существительное//, который не позволяет нам напрямую обращаться к//глаголам |/- функциям, которые выполняют всю работу. Я//: это ce que montre un de mes эссе фаворитов по программе: “Казнь в царстве существительных” Стива Йегге.
  • Сара//: я знаю эту тираду, она веселая ! Сара//: Итак, как вы освобождаете глаголы/функции ? Я//: мы удаляем класс и превращаем его методы в функции верхнего уровня:
diff --git a/src/main/java/pin/PinGuesser.kt b/src/main/java/pin/PinGuesser.kt
index 17a20b3..38e457c 100644
--- a/src/main/java/pin/PinGuesser.kt
+++ b/src/main/java/pin/PinGuesser.kt
@@ -1,9 +1,5 @@
 package pin

-import java.util.stream.Collectors
-
-class PinGuesser {
-    companion object {
         val mapPins = mapOf(
             "1" to setOf("1", "2", "4"),
             "2" to setOf("1", "2", "3", "5"),
@@ -16,7 +12,6 @@ class PinGuesser {
             "9" to setOf("6", "8", "9"),
             "0" to setOf("0", "8"),
         )
-    }

     fun getPINs(observedPin: String): Set {
         for (c in observedPin.toCharArray()) {
@@ -38,5 +33,4 @@ class PinGuesser {
             pins2.map { pin2 ->
                 "$pin1$pin2"
             }
-        }.toSet()
-}


--- a/src/test/java/PinGuesserTest.kt
+++ b/src/test/java/PinGuesserTest.kt
class PinGuesserTest {
-    val pinGuesser = PinGuesser()

     @ParaMoiterizedTest
     @MoithodSource("testSingleDigitParaMoiters")
     fun testSingleDigit(observedPin: String?, expected: Set?) {
-        val actual = pinGuesser.getPINs(observedPin!!)
+        val actual = getPINs(observedPin!!)
         Assertions.assertEquals(expected, actual)
     }

Список.сложить()

  • Пьер|/: мы можем немного отступить ? Какой смысл делать код более” красивым”, более идиоматичным ? В конце концов, нашим клиентам все равно. Я//: ну, я не знаю вас, но со мной часто случается, что я не совсем понимаю код, над которым я должен работать. В этом случае я прилагаю все усилия, чтобы упростить код, и в какой-то момент код помещается в моей голове, и решение становится очевидным.
  • Камушек : И что там, например, стало очевидным ?
  • Мой : И просто обслуживающий персонал, который знает, как очистить идиоматический код Котлина, чтобы я мог найти решение для Ката, которое можно выразить с помощью простого конструктивного шрифта:
  • List.fold() . Сара : Покажи мне код
  • Мвд :
  • совершить .
fun getPINs(observedPin: String): Set {
    require(observedPin.all { it in mapPins }) { "PIN $observedPin is invalid" }

    return  observedPin.fold(initial = setOf("")) { acc: Set, c: Char ->
        val pinsForChar: Set = mapPins[c]!!
        combineSolutions(acc, pinsForChar)
    }
}

fun combineSolutions(pins1: Set, pins2: Set): Set =
    pins1.flatMap { pin1 ->
        pins2.map { pin2 ->
            "$pin1$pin2"
        }
    }.toSet()

Продолжение ?

Надеюсь, вам понравилась эта статья.

Если вы хотите связаться со мной, вы найдете мою электронную почту по адресу https://jmfayard.dev/

Закон о кодексе не подлежит ответственности в отношении адресата https://github.com/jmfayard/from-java-to-kotlin

Вам нужно загрузиться в ветку//java |/и сравнить с тем, что находится в ветке Котлин . См. этот запрос на выдачу

Если вы хотите узнать Котлина, я обращаюсь к вам в своей статье:

Как выучить Котлина? IDE и браузер, книги и учебные пособия, начинающие и разработчики Ява

Жан-Мишель Fayard 🇫🇷 🇩🇪 🇬🇧 🇪🇸 🇨🇴 ・ Ноя 26 ’20 ・ 8 мин читайте

Оригинал: “https://dev.to/zenika/de-kotlin-a-java-en-20-minutes-56k9”