Angesichts der kürzlich von Google angekündigten offiziellen Kotlin- Unterstützung für die Android-Entwicklung hielt ich es für angebracht, die Community nach einigen großartigen Golftipps für diese relativ neue JVM-Sprache zu befragen.
Kotlin bietet eine einzigartige Kombination von Merkmalen unter seinen JVM-Geschwistern, die es potenziell attraktiv für das Golfen macht:
- Überlastung des Bedieners
- lokale , Infix- und statische Erweiterungsfunktionen
- kluge Besetzungen
- Groovige typsichere Builder
- Geben Sie Aliase ein
- Bereiche
- ein umfangreiches Funktions Sammlungen Paket
- Scripting-Unterstützung
Wie quetsche ich die letzten Bytes aus meinem Kotlin-Programm? Ein Tipp pro Antwort, bitte.
Antworten:
Erweiterungsfunktionen
Erweiterungsfunktionen können wirklich dazu beitragen, die Namen der eingebauten Methoden und ihrer Ketten zu reduzieren. Ein Beispiel könnte sein:
fun String.c() = this.split("").groupingBy{it}.eachCount()
das hilft aber nur wenn:
A) Der Anruf ist lang genug, um die Definition aufzuheben
B) Der Anruf wird wiederholt
Verwendung von Lambdas anstelle von Methoden
Lambdas können zurückkehren, ohne das Schlüsselwort return zu verwenden, wodurch Bytes gespart werden
KotlinGolfer
Ein Projekt, das ich hier gestartet habe und das hübschen Kotlin-Code nimmt und automatisch Beiträge mit Tests und TIO-Links erstellt
quelle
Verwenden Sie
+
anstelle vontoString
Wie zu erwarten ist, wird
String
der+
Operator für die Verkettung von Zeichenfolgen wie folgt überlastet .Das Überprüfen der Dokumente zeigt uns jedoch, dass dies
Any?
nicht nur akzeptiert wirdString
. Wie angegeben:Stellen Sie also
String + anything
sicher, dass Sie.toString()
vor dem Verketten auf der rechten Seite aufrufen . Dies ermöglicht uns eine Verkürzungit.toString()
auf""+it
massive 8-Byte-Einsparungen im besten Fall und 6-Byte-Einsparungen im schlechtesten Fall.Verwenden Sie
fold
anstelle vonjoinToString
Im Zusammenhang mit dem oben, wenn Sie anrufen
map
und dannjoinToString
können Sie , dass verkürzen , indem Siefold
statt.quelle
Ab 1.3 können Sie Argumente in fun main () komplett weglassen und so 18 Zeichen (also die Länge von
args:Array<String>
) weglassen .quelle
Int's in params definieren
Dies wird wahrscheinlich einige ziemlich spezifische Anwendungsfälle haben, in denen es sich lohnt, aber in der letzten Frage, die ich gestellt habe, konnte ich ein paar Bytes einsparen, indem ich meine Variable als optionale Parameter definierte, anstatt sie in der Funktion zu definieren.
Beispiel aus meiner Antwort auf diese Frage:
Variable in der Funktion definieren:
fun String.j()={var b=count{'-'==it}/2;var a=count{'/'==it};listOf(count{'o'==it}-a,a-b,b)}
Variablen als Parameter definieren:
fun String.j(b:Int=count{'-'==it}/2,a:Int=count{'/'==it})=listOf(count{'o'==it}-a,a-b,b)
weil
var a=
es die gleiche Länge hat, wiea:Int=
es die gleiche Anzahl von Bytes ist, um sie zu definieren (dies ist jedoch nur der FallInt
), da ich jetzt nur eine Zeile in der Funktion habe, kann ich die löschen{}
und ich lösche auch eine einzelne;
(die andere ist) ersetzt durch a,
)Wenn es also Funktionen gibt, für die ein Int definiert werden muss, und wenn Sie das Int in der Funktion nicht definiert haben, ist dies ein 1-Liner. Wenn Sie dies als Parameter tun, sparen Sie ein paar Bytes
quelle
Die
to
Infix-FunktionEs gibt eine Standard-Infix-Funktion
to
, diePair
s aus zwei Werten erstellt. Es wird häufigmapOf()
für die Definition vonMap
s verwendet, kann aber möglicherweise viel kürzer als derPair()
Konstruktor sein.quelle
Zerstörung in Lambda-Argumenten
Angenommen, Sie möchten ein
Pair<*,*>
in einem Lambda akzeptieren . Normalerweise wäre der Umgang damit ärgerlich. Als Beispiel ist hier ein Lambda, das einPair
und prüft, ob die beiden Werte gleich sind:Das ist langatmig und ungeschickt. Glücklicherweise Kotlin kann Sie jeden zerstörbaren Typen destrukturiert (jede Art , dass Geräte
componentN()
Methoden, wie zum BeispielPair
,Triple
etc.) als Argument an ein Lambda. Wir können dies also folgendermaßen umschreiben:Es sieht ähnlich aus wie die Mustererkennung für ein Tupel in so etwas wie F #, und es ist in vielen Fällen. Aber eine Vielzahl von Typen in Kotlin unterstützen die Destrukturierung (
MatchResult
ist nützlich).Sie können jedoch weitere Argumente verwenden. Angenommen, Ihr Lambda musste einen
Pair
und einen zusätzlichen Wert annehmen . Sie schreiben die Lambda-Signatur einfach so:quelle