Ответы пользователя по тегу Kotlin
  • Что значит однородные и неоднородные данные? Подчеркивающие структуры данных?

    @koperagen
    Ты набрел на сайт машинного перевода ответов со стаковерфлоу.
    В оригинале так:

    1. Arrays store homogeneous data. Collections store both homogeneous as well as heterogeneous data.
    По этим ключевым словам (java homogeneous heterogeneous data) гуглится такой ответ https://stackoverflow.com/questions/36700490/what-...

    2. In Arrays, there are no underlining data structures, whereas Collections have underlining data structures.
    Думаю тут опечатка, имеется ввиду underlying, т.е. "коллекции основываются на структурах данных". Для Map это, например, хэш массив, дерево, trie, для List связный список, массив и т.д.
    Ответ написан
  • Почему при увеличении числа в корутинах, число иногда имеет другое значение?

    @koperagen
    В комментарии обсудили (: Лог выводится до того, как все корутины отработают увеличение счетчика
    Ответ написан
  • Как переписать этот код на использование корутин в котлине?

    @koperagen
    Привет. Зависит от того, что тебе нужно сделать. Если просто хочешь завернуть результат suspend функции в CompletableFuture, то тебе поможет адаптер https://github.com/Kotlin/kotlinx.coroutines/tree/...
    Но в kotlinx.coroutines есть свой примитив для этого, Defered. С ним код будет выглядеть так
    result = async {
        myService.getInfo()
    }

    Если вопрос именно про переписывание, то поделись информацией о том что ты вообще делаешь, как используешь в своем коде этот CompletableFuture.
    Ответ написан
  • Как post-запрос на postman перенести в kotlin?

    @koperagen
    Я правильно понимаю, что ты хочешь из программы на Kotlin сделать запрос к серверу, аналогичный запросу в Postman? Если да, то берешь какой-то HTTP клиент и пишешь запрос руками. Вот например - https://khttp.readthedocs.io/en/latest/ мимикрирует под питоновский Requests
    Если нет, уточни вопрос плиз. А то из вопроса не понятен контекст, может там постман умеет в какую-то кодогенерацию или ещё что-то умное
    Ответ написан
  • Как перейти на разработку под андроид?

    @koperagen
    Попробуй начать с Codelabs. В них проходят по всем современным практикам разработки приложений
    https://developer.android.com/courses/kotlin-andro...
    https://developer.android.com/courses/kotlin-andro...
    Если понравится такой формат, то их там кроме этих курсов ещё не один десяток, но уже более конкретные. Например, по Material Design'у, работе с корутинами или MotionLayout'ом
    Ответ написан
  • Почему коллекции в Kotlin урезаны?

    @koperagen
    Ответ в мультиплатформенности.
    Когда пишите на котлине под JVM, вы можете использовать весь набор Java коллекций. Картинка снизу какая-то не полная, как минимум на ней нет Map и MutableMap. Как максимум, раз уж у них java.util.HashSet реализует MutableSet, то и LinkedHashSet, TreeSet - тоже.
    Но вообще это не справедливо, если код компилируется под JS или Native.
    Ответ написан
  • Как решить задачку на Kotlin?

    @koperagen
    Предполагая, что вы прочитали этот файл и сохранили в List, где DataObject это представление строки из этого файла, что-то вроде data class DataObject(val n: Int, val item: String, val date: String), код можно написать примерно так
    val representation = list
      .sortedBy { it.n }
      .map { it.item }
      .dropLast(5)
      .joinToString("\n")
    println(representation)

    Собственно из примера не очень понятно, что за файл и его формат. Вроде похоже на CSV с 3 столбцами, тогда берем https://github.com/doyaaaaaken/kotlin-csv
    val file: File = File("test.csv")
      val rows: List<List<String>> = csvReader().readAll(file)
      val list: List<DataObject> = rows.map { (first, second, third) -> DataObject(first.toInt(), second, third) }

    Получаем нужный список с данными из таблицы.
    Ответ написан
  • Объясните что проиходит в блоке кода?

    @koperagen
    Эта запись аналогична
    takeIf { it.isNotEmpty() }
    Двоеточие в котлине означает получение ссылки на функцию/свойство. Строка List::isEmpty в частности возвращает ссылку типа (List<Int>) -> Boolean. У takeIf аргумент - это функциональный тип (T) -> Boolean, в данном случае List<Int> -> Boolean.
    Ответ написан
  • Как в kotlin правильно сделать кеширование свойств объекта?

    @koperagen
    Вы уверены, что эти вычисления вашу программу нагружают? Просто проблема в том, что тут с какой стороны не подойти, она значительно усложнится от добавления таких вот оптимизаций. Если нужно поработать с каким-то значением много раз, то самое простое решение это сохранить его в локальную переменную там, где это необходимо. Другим простым решением может быть data class с неизменяемыми свойствами, и вместо изменений значений создание копии через copy. Тут ещё стоит спросить, а многопоточная ли у вас программа, а отображаются ли эти свойства где-то в UI.
    Если же вопрос чисто академический, типа как в теории можно делать именно то, что вы хотите, то смотрите в сторону мемоизации или свойств-делегатов. Через мемоизацию функция от аргумента в результат при одинаковых аргументах будет высчитываться только один раз, результат обычно сохраняют в мапу. Тогда можно написать этих мемоизированных функций по количеству свойств класса, которые вы хотите кэшировать, и при обращении к проперти вызывать соответствующую функцию в gettere. Проблема тут в том, что в мапа это отображение из одного объекта в другой, а у функции несколько аргументов может быть. Придется писать data classы для каждого такого случая. На делегатах можно нагородить что-то такое
    Шок контент, не рекомендую использовать

    data class Box(var height: Int, var width: Int) {
        val area by DependingCalculation(::height, ::width) {
            println("Calculated")
            height * width
        }
    }
    
    class  DependingCalculation<R>(private val dependencies: List<KProperty0<*>>, private val calculation: () -> R) {
        private var prevValues = dependencies.map { it.get() }
        private var cache = calculation()
    
        operator fun getValue(thisRef: Any?, property: KProperty<*>): R {
            val newValues = dependencies.map { it.get() }
            return if (newValues == prevValues) {
                cache
            } else {
                calculation().also {
                    prevValues = newValues
                    cache = it
                }
            }
        }
    
        constructor(vararg dependencies: KProperty0<*>, calculation: () -> R) : this(dependencies.asList(), calculation)
    }
    
    fun main() {
        val box = Box(1, 2)
        println(box.area)
        println(box.area)
        box.width = 4
        println(box.area)
    }

    Ответ написан
  • Как вызвать нужный переопределенный метод используя полиформизм?

    @koperagen
    Коротко: В рамках полиморфизма ваша задача решается созданием нового объекта, A2.
    Объяснение: Если определить метод в классе-родителе, а затем переопределить его у ребенка, то всегда будет вызван метод фактического класса объекта, т.е. класса чей конструктор был вызван при создании объекта. Вызываемый метод не будет зависеть от типа ссылки на этот объект. За счет этого, собственно, достигается полиморфизм: Вам не нужно знать, какая именно реализация метода у объекта, который вам передали, и вообще реальный класс объекта. Вы объявляете ссылку на интерфейс/абстрактный класс/открытый класс в качестве параметра вашей функции/конструктора вашего класса и работаете с доступными этой ссылке методами, чтобы сделать то, для чего ваша функция/класс предназначен. Тем самым давая возможность клиенту варьировать поведение вашего кода.
    Приведение типа дает доступ к специфичным для конкретного класса полям, т.е. был бы в A2 ещё какой-то метод (не реализация метода родителя, а именно что-то свое), после приведения вы могли бы его вызывать. Но это, опять же, не про полиморфизм.
    Ответ написан
  • Профит от многопоточности на простом примере?

    @koperagen
    Взять и написать параллельный код на тредах не так уж тривиально. Лучше берите Stream API, с его помощью сортировки, map-reduce операции и много чего ещё отлично ускоряется кратно количеству ядер.
    Ответ написан
  • Как задать стартовый клас в gradle (Kotlin, KotlinDSL,Gradle)?

    @koperagen
    Попробуйте поменять
    mainClassName = "dev.glo.Main"
    на
    mainClassName = "dev.glo.MainKt"
    Ответ написан
  • Как стать Котлин разработчиком?

    @koperagen
    Смотря, что вы под этим понимаете. Не думаю, что можно стать "профессиональным котлин разработчиком". Это будет либо мобильная разработка, либо бэкенд. В теории можно и десктоп с фронтом пилить. Но ни в одном из этих случаев знания самого языка не будут решающими.
    Если абстрагироваться и от направлений, то всегда будет полезно знать хотя бы распространенные структуры данных, парадигмы (структурная, объектно-ориентированная, функциональная), паттерны, используемые в этих парадигмах, принципы проектирования (SOLID, KISS, YAGNI). Это и к языку не привязано.
    Дальше - работа с БД (SQL, NoSQL), HTTP, асинхронность (Coroutines как пример средства реализации асинхронности). Тут придется выбирать библиотеки, доступные для котлина и изучать их.
    Это все скорее всего встретится. Но можно под андроид начать приложения делать и с 0. Есть обучающие курсы, в которых все нужное расскажут. По остальным направлениям их меньше, но тоже достаточно. Для бэкенда отправная точка - ktor, для desktop - tornadofx.
    Java код вам наверняка придется читать, поэтому хотя бы поверхностно стоит изучить.
    Ответ написан
  • Есть ли аналог пакета requests из python под kotlin(java)?

    @koperagen
    khttp мимикрирует под requests, об этом в документации даже написано
    Ответ написан