Dado o recente anúncio do Google do suporte oficial da Kotlin para o desenvolvimento do Android, achei que seria oportuno pesquisar na comunidade algumas dicas impressionantes de golfe para esse relativamente novo idioma da JVM.
O Kotlin inclui uma combinação única de recursos entre os irmãos da JVM, o que o torna potencialmente atraente para o golfe:
- sobrecarga do operador
- funções de extensão local , infix e estática
- elencos inteligentes
- Construtores de tipo seguro para o estilo Groovy
- aliases de tipo
- gamas
- um extenso pacote de coleções funcionais
- suporte de script
Então, como espremer os últimos bytes do meu programa Kotlin? Uma dica por resposta, por favor.
Respostas:
Funções de extensão
As funções de extensão podem realmente ajudar a reduzir os nomes dos métodos incorporados e as cadeias deles, um exemplo pode ser:
fun String.c() = this.split("").groupingBy{it}.eachCount()
mas isso só ajuda se:
A) A chamada é longa o suficiente para cancelar a definição
B) A chamada é repetida
Uso de lambdas em vez de métodos
Lambdas pode retornar sem usar a palavra-chave return, salvando bytes
KotlinGolfer
Um projeto que eu comecei aqui, que pega bastante o código Kotlin e fornece postagens com testes e links TIO automaticamente
fonte
Use em
+
vez detoString
Como seria de esperar,
String
sobrecarrega o+
operador para concatenação de cadeias de caracteres, assim.No entanto, verificar os documentos nos diz que aceita
Any?
, não apenasString
. Como declarado:Em outras palavras,
String + anything
certifique-se de ligar.toString()
do lado direito antes de concatenar. Isso nos permite reduzirit.toString()
para""+it
uma economia massiva de 8 bytes na melhor das hipóteses e 6 bytes na pior.Use em
fold
vez dejoinToString
Relacionado ao acima, se você estiver ligando
map
ejoinToString
, em seguida , poderá reduzi-lo usandofold
.fonte
A partir da versão 1.3, você pode omitir args no fun main () completamente, eliminando 18 caracteres (ou seja, o comprimento de
args:Array<String>
).fonte
Definindo Int's em params
Isso provavelmente terá alguns casos de uso bastante específicos, nos quais pode valer a pena, mas na pergunta recente que joguei, descobri que poderia salvar alguns bytes definindo minha variável como parâmetros opcionais em vez de defini-los na função.
Exemplo da minha resposta a esta pergunta:
variável definidora na função:
fun String.j()={var b=count{'-'==it}/2;var a=count{'/'==it};listOf(count{'o'==it}-a,a-b,b)}
definindo variáveis como parâmetros:
fun String.j(b:Int=count{'-'==it}/2,a:Int=count{'/'==it})=listOf(count{'o'==it}-a,a-b,b)
porque
var a=
tem o mesmo comprimento,a:Int=
pois será o mesmo número de bytes para defini-los (este é apenas o casoInt
), no entanto, como agora tenho apenas 1 linha na função, posso soltar o{}
e solto também um;
(o outro é substituído por a,
)Portanto, se houver alguma função que exija a definição de um Int e um liner 1 se você não definir o int na função - fazê-lo como um parâmetro economizará alguns bytes
fonte
A
to
função infixExiste uma função infix padrão denominada
to
que criaPair
s de dois valores. É comumente usado commapOf()
para definirMap
s, mas pode ser muito mais curto que oPair()
construtor.fonte
Reestruturação em argumentos lambda
Digamos que você queira aceitar um
Pair<*,*>
em um lambda. Normalmente, lidar com isso seria irritante. Como exemplo, aqui está um lambda que pega aePair
verifica se os dois valores são iguais:Isso é longo e desajeitado. Felizmente, Kotlin permite desestruturar qualquer tipo destructable (qualquer tipo que implementa
componentN()
métodos, tais comoPair
,Triple
etc.) como argumentos para um lambda. Portanto, podemos reescrever isso da seguinte maneira:É semelhante ao padrão que corresponde a uma tupla em algo como F # e, em muitos casos, é. Mas uma grande variedade de tipos no Kotlin suporta a desestruturação (
MatchResult
é útil).Você pode ter mais argumentos, no entanto. Digamos que o seu lambda teve que assumir um
Pair
valor adicional. Você simplesmente escreveria a assinatura lambda assim:fonte