原文链接是《What's New in Kotlin 1.2》,下面的译文节选了“其它的语言特性”部分(“Other Language Features”)
@CacheConfig(cacheNames = ["books", "default"])
public class BookRepositoryImpl {
// ...
}
可见新的数组参数声明语法依赖于注解方式。
fun test() {
lateinit var x: Component
val injector = inject(
...,
componentProvider = { x },
...
)
x = injector.createComponent()
}
class Foo {
lateinit var lateinitVar: String
fun initializationLogic() {
//sampleStart
println("isInitialized before assignment: " + this::lateinitVar.isInitialized)
lateinitVar = "value"
println("isInitialized after assignment: " + this::lateinitVar.isInitialized)
//sampleEnd
}
}
fun main(args: Array) {
Foo().initializationLogic()
}
//sampleStart,第一行的it.toString()就是默认参数值
inline fun Iterable.strings(transform: (E) -> String = { it.toString() }) =
map { transform(it) }
val defaultStrings = listOf(1, 2, 3).strings()
val customStrings = listOf(1, 2, 3).strings { "($it)" } //是外部传入的参数值
//sampleEnd
fun main(args: Array) {
println("defaultStrings = $defaultStrings")
println("customStrings = $customStrings")
}
val button = findViewById(R.id.button) as Button
fun countFirst(s: Any): Int {
//sampleStart
val firstChar = (s as? CharSequence)?.firstOrNull()
if (firstChar != null)
return s.count { it == firstChar } // 输入参数s被智能转换为CharSequence类型
val firstItem = (s as? Iterable<*>)?.firstOrNull()
if (firstItem != null)
return s.count { it == firstItem } // 输入参数s被智能转换为Iterable<*>类型
//sampleEnd
return -1
}
fun main(args: Array) {
val string = "abacaba"
val countInString = countFirst(string)
println("called on \"$string\": $countInString")
val list = listOf(1, 2, 3, 1, 2)
val countInList = countFirst(list)
println("called on $list: $countInList")
}
另外,Lamba表达式同样支持对局部变量进行智能转换,前提是该局部变量只在Lamba表达式之前修改过。比如下面这样:
fun main(args: Array) {
val flag = args.size == 0
//sampleStart
var x: String? = null
if (flag) x = "Yahoo!"
run {
if (x != null) {
println(x.length) // x被智能转换为String类型
}
}
//sampleEnd
}