Mengingat pengumuman Google baru-baru ini tentang dukungan resmi Kotlin untuk pengembangan Android, saya pikir mungkin sudah saatnya untuk memberi polling kepada masyarakat tentang beberapa kiat bermain golf yang luar biasa untuk bahasa JVM yang relatif baru ini.
Kotlin menyertakan kombinasi fitur yang unik di antara saudara-saudara JVM-nya yang membuatnya berpotensi menarik untuk bermain golf:
- operator kelebihan beban
- fungsi ekstensi lokal , infiks , dan statis
- gips cerdas
- Pembangun tipe aman ala groovy
- ketik alias
- rentang
- paket koleksi fungsional yang luas
- dukungan scripting
Jadi, bagaimana saya memeras beberapa byte terakhir dari program Kotlin saya? Tolong, satu tip per jawaban.
Jawaban:
Fungsi Ekstensi
Fungsi ekstensi benar-benar dapat membantu mengurangi nama metode bawaan, dan rangkaiannya, contohnya bisa:
fun String.c() = this.split("").groupingBy{it}.eachCount()
tetapi ini hanya membantu jika:
A) Panggilan cukup lama untuk membatalkan definisi
B) Panggilan diulang
Penggunaan lambdas daripada metode
Lambdas dapat kembali tanpa menggunakan kata kunci kembali, menghemat byte
KotlinGolfer
Sebuah proyek yang saya mulai di sini yang mengambil kode Kotlin cantik dan memberikan posting dengan tes dan tautan TIO secara otomatis
sumber
Gunakan
+
sebagai gantitoString
Seperti yang bisa diduga,
String
membebani+
operator untuk penggabungan string, seperti itu.Namun, memeriksa dokumen memberi tahu kami bahwa ia menerima
Any?
, bukan hanyaString
. Sebagaimana dinyatakan:Dengan kata lain,
String + anything
pastikan untuk memanggil.toString()
sisi kanan sebelum bergabung. Hal ini memungkinkan kita untuk mempersingkatit.toString()
untuk""+it
, besar-besaran 8 tabungan byte terbaik dan 6 byte paling buruk.Gunakan
fold
sebagai gantijoinToString
Terkait dengan hal di atas, jika Anda menelepon
map
kemudianjoinToString
, Anda dapat mempersingkatnya dengan menggunakanfold
.sumber
Mulai dari 1.3 Anda dapat menghilangkan args di main main () sepenuhnya, sehingga mencukur 18 karakter (yaitu, panjang
args:Array<String>
).sumber
Menentukan Int dalam params
Ini kemungkinan akan memiliki beberapa kasus penggunaan yang cukup spesifik di mana mungkin sepadan, tetapi dalam pertanyaan terakhir saya bermain golf saya menemukan saya bisa menghemat beberapa byte dengan mendefinisikan variabel saya sebagai parameter opsional daripada mendefinisikan mereka dalam fungsi.
Contoh dari jawaban saya untuk pertanyaan ini :
mendefinisikan variabel dalam fungsi:
fun String.j()={var b=count{'-'==it}/2;var a=count{'/'==it};listOf(count{'o'==it}-a,a-b,b)}
mendefinisikan variabel sebagai params:
fun String.j(b:Int=count{'-'==it}/2,a:Int=count{'/'==it})=listOf(count{'o'==it}-a,a-b,b)
karena
var a=
panjangnyaa:Int=
sama dengan jumlah byte yang sama untuk mendefinisikannya (ini hanya berlaku untukInt
) namun karena saya sekarang hanya memiliki 1 baris dalam fungsi saya dapat menjatuhkan{}
dan saya juga menjatuhkan satu;
(yang lain adalah diganti dengan a,
)Jadi jika ada fungsi yang memerlukan mendefinisikan Int, dan akan menjadi 1 liner jika Anda tidak mendefinisikan int dalam fungsi - maka melakukannya sebagai parameter akan menghemat beberapa byte
sumber
Fungsi
to
infiksAda fungsi infix standar bernama
to
yang menciptakanPair
s dari dua nilai. Ini biasanya digunakan denganmapOf()
untuk mendefinisikanMap
tetapi berpotensi dapat menjadi jauh lebih pendek daripadaPair()
konstruktor.sumber
Destrukturisasi dalam argumen lambda
Katakanlah Anda ingin menerima
Pair<*,*>
dalam lambda. Biasanya, menangani ini akan mengganggu. Sebagai contoh, inilah lambda yang mengambil aPair
dan memeriksa apakah kedua nilainya sama:Ini bertele-tele dan canggung. Untungnya, Kotlin memungkinkan Anda untuk menghancurkan segala jenis yang dapat dirusak (jenis apa pun yang mengimplementasikan
componentN()
metode, sepertiPair
,Triple
dll.) Sebagai argumen untuk sebuah lambda. Jadi, kita dapat menulis ulang ini dengan cara berikut:Itu terlihat mirip dengan pola yang cocok dengan tuple dalam sesuatu seperti F #, dan dalam banyak kasus. Tetapi berbagai jenis di Kotlin mendukung perusakan (
MatchResult
yang bermanfaat.)Anda dapat mengambil lebih banyak argumen. Katakanlah lambda Anda harus mengambil
Pair
dan nilai tambah. Anda cukup menulis tanda tangan lambda seperti ini:sumber