前面我们介绍了Kotlin的基本用法,基本用法只是给我们展示了Kotlin最为简易,最为和善的一面。既然能够被Google钦点,那也说明Kotlin有其不平凡的伟大之处。下面依然是先介绍部分Kotlin知识,再练习一下Kotlin在Android中的使用,都是从官网学来的,强烈建议官网学习中文/英文。文中若有理解失误之处,欢迎批评指正。
一:Kotlin习惯用法
(1):创建集合
在Kotlin的世界里,如果我们需要对象,那么基本上不再需要与new打照面了。var 我们在前面介绍中知道,她是可以定义变量和常量的一个关键字。比如定义一个整型的变量。
var a=5 //自动推倒,错了,应该是自动推导
var a:Int=5 //显示指定变量a为Int类型
同样,我们也可以用var来定义一个集合
var intList=listOf(-3,-2,-1,0,1,2,3)
这样我们就可以得到一个整型的集合。我们也可以
var strList=listOf("kot","lin")
生成一个字符串集合。同时我们还可以对这些集合进行过滤操作,比如
var tempList=intList.filter{it>1}
上面这个语句的意思是,在刚才生成的集合基础上,调用一个filter函数,该函数有个过滤作用,可以将数组中不满足条件的元素过滤掉,然后将满足条件的元素生成一个新的集合。其中的it不能更换为其他的阿猫阿狗,还有注意是花括号,这里是约定俗成的写法。这个语句的另一种写法是
var tempList=intList.filter{x->x>1}
看起来不明觉厉。其实我也不是很懂哈。
(2):给函数设定默认值
fun test(a:Int=6,b:String="love"){...}
(3):===和==区别
==比较真实的值,而===则比较内存地址,比如下面这样一个例子
var a=1000 //自动推导为Int类型
var tempA:Int?=a
var tempB:Int?=a
println(a===a)
println(tempA===tempB)
println(a==a)
println(tempA==tempB)
上面这个例子,将会分别输出true,false,true,true。因为自动装箱之后,数字不会保留同一性,但会保留相等性。
(4):数字的隐式转换消失,需要显示转换
由于Int 和Long是两种不同的类型,所以不能进行隐式转换,需要显示转换
var a=100;
var b:Long?=a //这样是错误的,编译无法通过
不仅这样,就算将一个Int类型的值和一个Long类型的值进行值的比较也不可以
var a:Int=1000 //自动推导为Int类型
var b:Long=2000
println(a==b) //编译会报错
用官网的一句话就是
同一性和相等性都会悄无声息地消失
那么怎么才能不报错呢?那就需要显示转换
var a:Int=1000 //自动推导为Int类型
var b:Long=2000
println(a.toLong()==b)
每个数字有以下几种显示转换
toByte()
toShort()
toInt()
toLong()
toFloat()
toDouble()
toChar()
当然官网也给了我们一个计算的例子,用来表现隐式转换并没有完全消失不见
val a=2L+3 //Long+Int -->Long
这里的变量a就被自动推导为Long类型
(5):创建数组
var strArray=arrayOf(1,2,4)
// 创建一个 Array<String> 初始化为 ["0", "1", "4", "9", "16"]
val asc = Array(5, { i -> (i * i).toString() })
(6):字符串
在kotlin中字符串分为转义字符串和原生字符串。转义字符串类似java中的字符串。原生字符串如下
var strRaw="""abc
bcd \n
|123
|haha
"""
println(strRaw)
输出如下:
abc
bcd \n
|123
|haha
我们通过上面的输出可以看出来在原生字符串中,空格,换行,转义字符,都会原生保留下来。而至于转义字符串和java非常相似,相信大家都比较熟悉了。
二:离开了findViewById的Kotlin怎生书写?
前两天看一个Android-Kotlin开源项目PoiShuhui,项目是一个大二学生写的,顿时有一种被拍在岸上的感觉。看来活到老学到老非虚言也,现在的学生追技术,手速比我这老司机还块啊。打开项目一看,顿时傻眼了。这个FloatingActionButton没有findViewById啊,也没有什么注解,到底是为什么可以直接使用呢?
还好有官方文档,在Android扩展这一小节中,提到只要在build.gradle添加一个插件,就可以让我们摆脱掉findViewById的困扰。
image.png不知道是不是我理解失误,明明说的是在项目的build.gradle中添加,我添加了然后没用,最后还是移到了app中的build.gradle中,插件才起作用。
apply plugin: 'kotlin-android-extensions'
activity:
import kotlinx.android.synthetic.main.activity_about.*
class AboutActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_about)
webview.setWebViewClient(WebViewClient())
webview.loadUrl("http://www.kangaiweishi.com")
}
}
这样我们布局在layout中的webview的id就可以直接使用了。下面将Kotlin的传统写法也列出来
class AboutActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_about)
var web=findViewById(R.id.webview) as WebView
web.setWebViewClient(WebViewClient());
web.loadUrl("http://www.kangaiweishi.com")
// webview.setWebViewClient(WebViewClient())
// webview.loadUrl("http://www.kangaiweishi.com")
}
}
至于这个插件到底起到什么作用呢?官方文档是这么解释的
Kotlin Android Extensions is a plugin for the Kotlin compiler, and it does two things:
Adds a hidden caching function and a field inside each Kotlin Activity.
1:The method is pretty small so it doesn't increase the size of APK much.
2:Replaces each synthetic property call with a function call.
这个插件基本上不会增加apk的大小,所以尽管放心使用吧。
网友评论