考虑到Google最近宣布Kotlin正式支持Android开发,我认为现在应该就此相对较新的JVM语言向社区调查一些很棒的高尔夫技巧。
Kotlin在JVM兄弟中包括独特的功能组合,这使其对于打高尔夫球具有潜在的吸引力:
- 操作符重载
- local,infix和static扩展函数
- 聪明的演员
- Groovy样式的类型安全的构建器
- 输入别名
- 范围
- 广泛的功能性收藏包
- 脚本支持
那么,如何从Kotlin程序中挤出最后几个字节?请给每个答案一个提示。
考虑到Google最近宣布Kotlin正式支持Android开发,我认为现在应该就此相对较新的JVM语言向社区调查一些很棒的高尔夫技巧。
Kotlin在JVM兄弟中包括独特的功能组合,这使其对于打高尔夫球具有潜在的吸引力:
那么,如何从Kotlin程序中挤出最后几个字节?请给每个答案一个提示。
Answers:
+
代替toString
正如人们可能期望的那样,String
重载+
运算符以进行字符串连接,就像这样。
print("Hel" + "lo")
但是,检查文档会告诉我们它接受了Any?
,而不仅仅是接受String
。就像声明的那样:
返回通过将该字符串与给定其他对象的字符串表示形式连接而获得的字符串。
换句话说,请String + anything
确保.toString()
在连接之前先在右侧调用。这使我们可以缩短it.toString()
到""+it
,最多可节省8个字节,而最坏则可节省6个字节。
fold
代替joinToString
与上述相关,如果您呼叫map
,然后致电,则joinToString
可以改用fold
来缩短。
list.map{it.repeat(3)}.joinToString("")
list.fold(""){a,v->a+v.repeat(3)}
从1.3开始,您可以完全忽略fun main()中的args,从而减少了18个字符(即的长度args:Array<String>
)。
这可能会有一些非常值得使用的特定用例,但是在最近打高尔夫球的问题中,我发现可以通过将变量定义为可选参数而不是在函数中定义它们来节省一些字节。
我对这个问题的回答示例:
在函数中定义变量:
fun String.j()={var b=count{'-'==it}/2;var a=count{'/'==it};listOf(count{'o'==it}-a,a-b,b)}
将变量定义为参数:
fun String.j(b:Int=count{'-'==it}/2,a:Int=count{'/'==it})=listOf(count{'o'==it}-a,a-b,b)
因为var a=
它的长度与a:Int=
定义它们的字节数相同(这仅适用于Int
),但是由于我现在在函数中只有1行,因此可以删除,{}
并且也删除一个;
(另一个是替换为,
)
因此,如果有任何需要定义Int的函数,并且如果您未在函数中定义int,则将为1线性-那么将其作为参数进行操作将节省几个字节
假设您要接受Pair<*,*>
lambda中的a。通常,处理此问题会很烦人。举例来说,这是一个lambda,接受a Pair
并检查两个值是否相等:
{it.first==it.second}
这是漫长而笨拙的。幸运的是,科特林让你解构任何destructable类型(任何类型的实现componentN()
方法,如Pair
,Triple
等)作为参数传递给拉姆达。因此,我们可以通过以下方式重写它:
{(a,b)->a==b}
它看起来类似于在F#之类的模式中匹配元组。但是Kotlin中各种各样的类型都支持解构(MatchResult
非常有用。)
不过,您可以接受更多参数。假设您的Lambda必须取Pair
和一个附加值。您只需像这样编写lambda签名:
(a,b),c-> // pair first
a,(b,c)-> // pair second