Обновить
56
0
Nerumb @nerumb

Разработчик

Отправить сообщение
Почти тоже самое выступление Андрея Бреслава, что было на JPoint
Есть ли предпосылки, что язык станет популярен кроме Android'а и браузера (JS)?


Конечно есть :)
В back-end также наблюдается весьма активное движение в сторону Kotlin. Уже достаточно много больших компаний во всю у себя используют его в проде. А на JPoint 2017 Андрей Бреслав (руководитель разработки Kotlin), сказал что даже такие, казалось бы, консерваторы как банки, собрали консорциум и написали блокчейн решение полностью на Kotlin.
Если такая функция будет в классе A то это уже обычная функция класса (точнее в том виде как у вас это еще и функция расширение). В таком виде ее нельзя будет напрямую использовать в классе B.

Но если вы такую функцию объявите не в классе (или скажем в объекте или объекте компаньоне) то такую функцию можно будет вызвать:
Пример 1 с функцией верхнего уровня:
файл test/A.kt:
package test

fun String.countAmountOfX(): Int {
    return length - replace("x", "").length
}

файл test/B.kt:
package test

class B {
    fun testCall(): Unit {
        "asdf".countAmountOfX()
    }
}

Пример 2 с объектом компаньоном:
файл test/A.kt:
package test

class A {
    companion object {
        fun String.countAmountOfX(): Int {
            return length - replace("x", "").length
        }
    }
}

файл test/B.kt:
package test

import test.A.Companion.countAmountOfX

class B {
    fun testCall(): Unit {
        "asdf".countAmountOfX()
    }
}

Пример 3 с функцией в объекте:
файл test/A.kt:
package test

object A {
    fun String.countAmountOfX(): Int {
        return length - replace("x", "").length
    }
}

файл test/B.kt:
package test

import test.A.countAmountOfX

class B {
    fun testCall(): Unit {
        "asdf".countAmountOfX()
    }
}

Надеюсь что ответил на ваш вопрос.
А такие функции можно переиспользовать

Если под переиспользовать подразумевается переопределить, то ответ — нет.

Функция верхнего уровня в Kotlin:
fun test(): Unit {}   // in file Test.kt

В Java будет выглядеть в виде следующего:
public final class TestKt {
   public static final void test() {
   }
}

А в Java статичные функции переопределять нельзя, как и в Kotlin.
В данном случае как раз для author. Но вообще сами по себе именованные аргументы весьма полезны. Так, например, если есть набор параметров, и у всех есть значения по умолчанию, то можно указывать значения только для нужных. Пример:

fun someAction(repeat: Int = 1, timeout: Long = 1000, log: Boolean = false, action: () -> Unit) {
   // -----
}

//use 1
someAction(repeat = 3) {
   println("Hi!")
}

//use 2
someAction(timeout  = 5000, log = true) {
   println("Message, after timeout")
}
В будущем, быть может, на Kotlin кто нибудь решиться :)

Скоро выйдет Spring 5.0, хороший повод начать использовать Kotlin :)
Кстати, у вас ведь по большей части Spring везде используется? А не смотрели в сторону Vert.x или может Ratpack?
Интересно, а в Альфа-Лаборатории используются ли другие языки JVM?
Jquery для ajax запросов в статье используется.
Я и не говорю что интероп 100%, но тем не менее он очень хороший.

Как эту функцию можно вызвать и пользоваться ей в Java коде

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

Что если у вас есть класс из какой-нибудь библиотеки Java, к которому у вас нет доступа изменять исходники и интерфейс из совершенно другой библиотеки

В таком случае сделать это прям как в Scala нельзя, но можно, например, сделать обертку, а для генерации обертки сделать extension метод на нужном классе (не очень красиво, но и не прям очень страшно будет)
Если extension methods аналог implicit для задачи расширения функциональности, то как можно с помощью Котлиновского extension methods расширить класс внешним интерфейсом?

C помощью extension методов думаю никак, но можно это сделать делегатом:
class Test: IAddition by Addition() {
    //many code
}

interface IAddition {
    fun add(): Int
}

class Addition: IAddition {
    override fun add(): Int = 100500
}

Как сохраняется интероп с java при использовании корутин?

Корутины сделаны средствами языка, это те же extension методы и т.п.

Есть ли возможность вызвать suspend function из java?

Насколько я знаю — нет, также как и не вызвать inline функции.

Как бы например выглядело использование buildSequence в java?

Вполне себе неплохо.
Код на kotlin:
object Fibonaci {
    @JvmStatic
    fun fibonacciSeq(): Sequence<Int> = buildSequence {
        var a = 0
        var b = 1

        yield(1)

        while (true) {
            yield(a + b)

            val tmp = a + b
            a = b
            b = tmp
        }
    }
}


Вызов на java:
 Sequence<Integer> integerSequence = Fibonaci.fibonacciSeq();



Сущность.выбрать { атрибут1 > 1 }

Такое можно сейчас сделать с extension методами в совокупности в reified generic, если я правильно понял то что вы хотите сделать.
DSL сейчас уже есть, весьма удобный.
Gradle уже сейчас позволяет билд скрипты писать на Kotlin, код почти не отличается от Groovy.

А можете привести пример где нужно именно AST трансформация?
очень много удобных штук по сравнению со Scala

Не скажу что прям *много*, но все же они есть:
— В Kotlin хорошо реализован null safely, который встроен в сам язык, что, например, позволяет заменить Option в большинстве случаев на nullable типы, с которыми удобнее работать (тот же?. вместо flatMap, map ..) да и к тому же нет оверхеда на создание лишнего класса.
— Отличный интероп с java. Java из Kotlin выглядит как Kotlin и наоборот. Нет конвертации типов между языками, тот же List в Kotlin это ArrayList в Java и т.д.
— Меньший размер библиотеки (особенно существенно для Android)
— За счет того что язык проще, для него лучше туллинг в студии (не последний фактор также и то что язык от той же студии) и быстрее время компиляции.
— Смарт касты. Ниже в обсуждении Fervus привел пример что в Scala они также есть, это не совсем так, все же они немного разные. В Scala это только работает в pattern matching, а в Kotlin можно проверить неизменяемую переменную на null в if, и внутри ветви с ненулевым значением переменной она будет автоматически приведена к non-nullable типу (тоже самое с проверкой типа переменной). Также smart cast в Kotlin работает в when, где по сути получается урезанный вариант pattern matching из Scala.
— Extension методы, в какой-то мере это аналог implicit из Scala (для задач расширения функциональности существующих классов). В Kotlin также можно передавать extension методы в качестве lambda параметров методов (что весьма удобно, например, для построения DSL)
— функции стандартной библиотеки, всякие apply, run, with, let, also и т.п.
— обратная совместимость, можно всегда жить на свежих релизах не дожидаясь пока все библиотеки переедут на новую версию :)
— достаточно простой результирующий байт код, со всем просто разобраться что во что компилируется.
— inline с «нелокальными» переходами
— делегаты

А так, можно привести комментарий Андрея Бреслава про сравнение Kotlin/Scala из обсуждения: Kotlin, кому что нравится :)
А можете чуть подробнее сказать, под «жертвами» что вы подразумеваете?
В kotlin можно на любой коллекции вызвать asSequence и перейти к lazy вычислениям в map->filter и т.п.
В вашем примере блок
"test1" to 10
"test2" to "name"
"test3"(50)

В «пустоту» уйдет…
Ну в backend тоже не все так гладко, go, rust, kotlin, scala, java, python, c++ (можно продолжать до бесконечности) и к каждому языку по вагону библиотек и фреймворков.
а потому что Scala это новые мощные абстракции, мощные библиотеки, мощные фреймворки, т.е. в целом инфраструктура>

И никто не мешает вам использовать библиотеки и фреймворки, написанные на Scala, в Kotlin…

Информация

В рейтинге
Не участвует
Откуда
Москва, Москва и Московская обл., Россия
Зарегистрирован
Активность