简介:
最近公司开展了一个新项目,自己考量了一下决定用kotlin来写.那么分享一下我的学习历程,希望对您有所帮助
-
implementation "org.jetbrains.anko:anko:0.10.8"
anko是使用kt语言来编写的一个android增强库,封装了很多东西,使我们的操作更加简化. - kt有自动映射功能,xml写了id,直接可以在kt中使用,无需findViewByid,直接把控件id当作对象使用即可.
数据类型
A:数据类型跟java一样(写法不一样)分别都有:
Int Long Folat Double Boolean Char String
转换的话--> i.toInt...其他方法一样
B:数组(数组其实也是大同小异,只不过String的时候有一些区别)
IntArray LongArray FolatArray DoubleArray BooleanArray CharArray
使用: var long:LongArray =longArrayOf(1,2,3)
使用StringArray: var string:Array<String> = arrayOf("哈","哈","大","笑")
C:集合的话跟Java都一些不一样:kt分为只读跟可变,就跟val跟var一样(前面是只读,后面是可变)
Set MutableSet List MutableList Map MutableMap
使用: var list:MutableList = listOf("1","2","3","4")
Map使用有一些不一样 (2种方式初始化,个人喜欢第一种,简单清晰)
val mapList: Map<String, String> = mapOf(Pair("1", "王涛"), Pair("2", "王飞"), Pair("3", "王伟"))`
`val mapList1: Map<String, String> = mapOf("1" to "王涛", "2" to "王飞", "3" to "王伟")
D:循环: for-in forEach 迭代器遍历(非常不喜欢)
for (item in mapList) {
string = "内容: ${item.key} --- ${item.value}"
toast(string)
}
mapList.forEach { key, value ->
string = "${string} 大家:${key} -- ${value}"
}
控制语句
A:条件分支:if-else基本没改动 swtich defult 改成 when else
tv.text = if(a == 1){"a 等等于 1"} else {"a 不等于 1"}
tv.text = when(t.text){
"1" -> "2"
"2" -> "3"
else ->"成功了"
}
B:等式判断: kt中String判断也可以使用 == .还有一种方式是 === 三个等号,自己去研究一下,是跟clone有关
C:is 和 in: instanceof == is (校验变量是否为某种类型)
in:java 中没有这个东西,他是判断数组或者集合中,存不存在此参数 (变量名 in 数组名)
D:条件循环: 比如从20-100循环偶数 恐怕之前的循环就做不到了.所以这边有条件循环
for(i in 10 until 22){ 这是10-20 包括10 但是不包括20}
for(i in 20 downTo 10) { 循环递减 从20递减到10 其中20跟10都包括}
for(i in 10 .. 20 step 2){每次循环递增2,其中包括10跟20,可以把..改成until,这样就只包括10}
E:跳出多层循环: outside@ while(){....break@outside} outside可以随便起名字 重要的是@符号
fun ss() {
var i = 1
outSide@ while (i<100000){
if (i == 50){
break@outSide
}
}
}
F:swtich去掉了,改成了when,写法如下
when (10) {
1 -> 0
2 -> 1
else -> 2
}
函数的基本用法
- A:Java中使用@Override 表示改函数重载父类的方法,kt使用小写的 override 在同一行表达重载操作
- B:Java中使用 public 表示该函数是公公方法,kt默认函数是公开,所以省略了public(省略不代表没有)
- C:Java中使用 void 表示改函数没有返回参数,kt不存在关键字 void(这个是没有)
- D:kt新增fun,类似于Java中的class
- E:Java的参数格式是:(变量类型 变量名称 举例:String str) kt(变量名称:变量类型 举例:str:String)
- F:kt引入了空安全机制,如果某个变量允许为空,就需要在变量类型后面加个? val string: String? = "123"
over fun onCreate(...)
fun getText(str:String,age:Int):String{
return string
}
//这样就不用全部传入了 只需要传入age
fun getText(age:String,str: String = "王涛", inte: Int = 2): String {
return "$str 第 $inte 次进入"
}
可变参数
- Java中是(String... args) kt中是(vararg args:String)
fun getVarText(vararg other: String): String {
var str = ""
return str
}
泛型函数
- 上面都说传入基本类型的比如(int,String,Double...),在开中传入集合,数组等也是很有必要的
fun <T> getListVararg(vararg other: T): String {
var str = ""
for (item in other) {
str = "$str 哈喽- $item \n"
}
return str
}
内联函数
-必须这么写,将<T>改为<reified T:Number>,同时必须在fun前面添加关键字inline 他跟上面的泛型函数的区别是,不支持多个,并且可以返回 T 类型
//这是Map
inline fun <reified T : String> getTextMap(other: Map<T, T>): String {
var str = ""
for (item in other) {
str = "$str 哈喽- ${item.key} -- ${item.value} \n"
}
return str
}
//这是List (返回list<T> 范型函数没办法返回List<T>)
inline fun <reified T : String> getTextList(other: List<T>): List<T> {
return other
}
简化函数
- 我认为他就是一个递增循环(自己调用自己),适合54321这种方式来用简化函数
//如果n==1, 输出的结果就是 5*4*3*2*1的结果
fun factorial(n:Int):Int = if(n<1)n else n*factorial(n-1)
同步java
在方法后面加入 @JvmOverloads constructor 这段代码 他就会给我去自动的同步java
companion object {} == static 同时{}里面可以方静态方法