kotlin的语法和java有一定的差别,在使用的时候有一些语法还是容易不适应,所以记录下来一些经常会用到的kotlin语法并带有注释和说明,方便更多人也方便自己在忘记时来查阅和使用~
1.关于创建对象
val a: Int = 100
println(a === a) // true,值相等,对象地址相等
//经过了装箱,创建了两个不同的对象
val boxedA: Int? = a
val anotherBoxedA: Int? = a
//虽然经过了装箱,但是值是相等的,都是100
println(boxedA === anotherBoxedA) // true,值相等,128 之前对象地址一样
println(boxedA == anotherBoxedA) // true,值相等
这里把 a 的值换成 100,这里应该原理跟 Java 中是一样的,在范围是 [-128, 127]之间并不会创建新的对象,比较输出的都是 true,从 128 开始,比较的结果才为false。
如果这里a的值超过了127,则两个对象值是相等的,但是对象的地址是不同的。
关于创建对象的优化:我们都知道java里面对new关键字的引用比较谨慎,为了避免内存消耗,尽量少使用new为优化原则,特别是尽量避免在循环中创建对象,这个应该在kotlin中也同样适用!
2.关于!!与?修饰变量的区别描述:
var a:String? = null
a!!.print() //a为空时停止执行,做短路操作,项目运行中会出现空指针崩溃
a?.print() //a为空时继续执行,但会抛出异常,但项目并不会报空指针而崩溃直接,是比较安全的一种用法
当我们直接调用一个可空变量的某方法或某成员变量时:
Android Studio会提示在一个可空变量上,只有"安全调用"(safe call (?.))和"不为空的断言调用"(non-null assert call(!!.))是被允许的,
可以得知"!!"相当于是短路操作,即:
//kotlin中的
a!!.print()
// 相当于java中的
if(a==null){
throw new NullPointerException()
}
而"?"相当于是安全类型的捕获或者抛出异常操作,即:
//kotlin中的
a?.print()
// 相当于java中的
if(a!=null){
a.print()
}
3.java中 extends kotlin用 (冐号):代替。
例如:java中:MainActivity extends Activity,
kotlin中:MaiActivity :Activity()
4.java中没能返回值是void,返回值写在小括号左面
现在改成空方法是Unit,方法用fun1, fun2,代替, 并且返回值要写在小括号后面
fun Unit(x: Any, y: Any) {
funUnit(x: Any, y: Any): Int{
5.关于 switch case
java中 switch():
switch(){
case:
breaak;
}
kotlin 中改变为 when() ->
fun main(args: Array) {
val language = if (args.size == 0) "EN" else args[0]
println(when (language) {
"python" -> "python!"
"java" -> "java!"
"kotlin" -> "you are a luckey dog!!!"
else -> "Sorry, I can't understand you in $language yet"
})
}
6.关于kotlin中的apply方法:
apply函数是这样的,调用某对象的apply函数,在函数范围内,可以任意调用该对象的任意方法,并返回该对象
代码示例
fun testApply() {
// fun <T> T.apply(f: T.() -> Unit): T { f(); return this }
ArrayList<String>().apply {
add("testApply1")
add("testApply2")
add("testApply3")
println("this = " + this)
}.let { println(it) }
}
// 运行结果
// this = [testApply1, testApply2, testApply3]
// [testApply1, testApply2, testApply3]
7.关于for循环
//可以这样写
var isSubs = false
for (i in 0 until myList.size) {
val sku = ownedSkus[i]
Log.d(TAG,"sku =="+sku .toString())
if (sku=="sub_monthly"){
isSubs = true
//如果满足条件,直接return结束循环
return isSubs
}
}
//也可以这样的方式写
for (i in 0..99) {
print(i.toString())
}
8.activity跳转的时候,intent写法:
//写法一
var intent = Intent(this,YourActivity().javaClass)
//写法二
var intent = Intent(this,YourActivity::class.java)
//最后放到 startActivity()方法里面就行
startActivity(Intent(intent))
9.一个类中的变量想实现java中共的pulic static修饰效果,直接用类名可以调用
//在 var 修饰符前加 open就行
open var zodiacZodiacDataMap: MutableMap<String, CompatibilityZodiacData>? = null
10.一个类中的方法与变量如果想实现java中的pulic static修饰效果,别的类可以直接用类名.调用出来可以这样写:
函数:
//在方法函数修饰符前加 open 并且放到 companion object {}中就行
companion object {
open fun shareMore(activity: Activity){
val textIntent = Intent(Intent.ACTION_SEND)
activity!!.startActivity(Intent.createChooser(textIntent, "Share"))
}
}
//调用时就可以直接用类名调用
SharerUtil.shareMore(this)
变量:
//如果想要一个变量对外以静态的形式开放,使其可以直接通过类名调用出来,可以这样写
class MainActivity : AppCompatActivity() {
companion object {
open var webview22: WebView? = null
}
}
//调用的时候这样调用:
MainActivity.Companion.getWebview22().loadUrl("http:baidu.com")
11.在kotlin中一些容器的创建方式:
//int数组
var inArray= intArrayOf(20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22)
//字符串 数组
var strArray = arrayOf("ss", "ss", "ss", "ss", "ss")
//字符串 map
var myDataMap: MutableMap<String, MyData>? = mutableMapOf<String,MyData>()
//字符串list
var strList = listOf( "ss", "ss", "ss", "ss", "ss")
//创建一个不可变的list
val mList = listOf<Int>(1, 2, 3)
//创建一个可变的list
val mList = mutableListOf<Int>(1, 2, 3)
//这里mutableListOf初始化了三个值,如果没有这三个值就相当于一个空集合,比如
val mList = mutableListOf<Int>()
12.kotlin中生成指定范围随机数的方法:
// 生成从0到2范围内的随机数(注意不包括2,实际生成的只有0和1)
var radomnum = Random().nextInt(2)
最后声明:以上是我个人一些经验的总结与归纳,如果有写的不对的地方,欢迎留言指正,谢谢!