Есть ли предпосылки, что язык станет популярен кроме 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()
}
}
В данном случае как раз для author. Но вообще сами по себе именованные аргументы весьма полезны. Так, например, если есть набор параметров, и у всех есть значения по умолчанию, то можно указывать значения только для нужных. Пример:
В будущем, быть может, на Kotlin кто нибудь решиться :)
Скоро выйдет Spring 5.0, хороший повод начать использовать Kotlin :)
Кстати, у вас ведь по большей части Spring везде используется? А не смотрели в сторону Vert.x или может Ratpack?
Я и не говорю что интероп 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
}
}
}
Не скажу что прям *много*, но все же они есть:
— В 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, кому что нравится :)
Ну в backend тоже не все так гладко, go, rust, kotlin, scala, java, python, c++ (можно продолжать до бесконечности) и к каждому языку по вагону библиотек и фреймворков.
Конечно есть :)
В back-end также наблюдается весьма активное движение в сторону Kotlin. Уже достаточно много больших компаний во всю у себя используют его в проде. А на JPoint 2017 Андрей Бреслав (руководитель разработки Kotlin), сказал что даже такие, казалось бы, консерваторы как банки, собрали консорциум и написали блокчейн решение полностью на Kotlin.
Но если вы такую функцию объявите не в классе (или скажем в объекте или объекте компаньоне) то такую функцию можно будет вызвать:
Пример 1 с функцией верхнего уровня:
файл test/A.kt:
файл test/B.kt:
Пример 2 с объектом компаньоном:
файл test/A.kt:
файл test/B.kt:
Пример 3 с функцией в объекте:
файл test/A.kt:
файл test/B.kt:
Надеюсь что ответил на ваш вопрос.
Если под переиспользовать подразумевается переопределить, то ответ — нет.
Функция верхнего уровня в Kotlin:
В Java будет выглядеть в виде следующего:
А в Java статичные функции переопределять нельзя, как и в Kotlin.
Скоро выйдет Spring 5.0, хороший повод начать использовать Kotlin :)
Кстати, у вас ведь по большей части Spring везде используется? А не смотрели в сторону Vert.x или может Ratpack?
Напрямую вызывать ее неудобно, но я не вижу кейсов где вам нужно именно так это делать. Да и при большом желании, как вы и привели пример, это сделать можно. Или можно воспользоваться моим примером вызова.
В таком случае сделать это прям как в Scala нельзя, но можно, например, сделать обертку, а для генерации обертки сделать extension метод на нужном классе (не очень красиво, но и не прям очень страшно будет)
C помощью extension методов думаю никак, но можно это сделать делегатом:
Корутины сделаны средствами языка, это те же extension методы и т.п.
Насколько я знаю — нет, также как и не вызвать inline функции.
Вполне себе неплохо.
Такое можно сейчас сделать с extension методами в совокупности в reified generic, если я правильно понял то что вы хотите сделать.
Gradle уже сейчас позволяет билд скрипты писать на Kotlin, код почти не отличается от Groovy.
А можете привести пример где нужно именно AST трансформация?
Не скажу что прям *много*, но все же они есть:
— В 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, кому что нравится :)
В «пустоту» уйдет…
И никто не мешает вам использовать библиотеки и фреймворки, написанные на Scala, в Kotlin…