koltin知识点概要

1.字符串拼接

java:
String firstName = "Amit";String lastName = "Shekhar";String message = "My name is: "+ firstName + " " + lastName;
kotlin
val firstName = "Amit"val lastName = "Shekhar"val message = "My name is: $firstName $lastName"

2.换行

• Java
String text = "First Line\n" +
              "Second Line\n" +
"Third Line";
• Kotlin
val text = """ |First Line |Second Line |Third 

3.三元表达式

• Java
		String text = x > 5 ? "x > 5" : "x <= 5";
• Kotlin
val text = if (x > 5)
              "x > 5"
else "x <= 5"

4.操作符

• java
final int andResult = a & b;final int orResult = a | b;final int xorResult = a ^ b;finalintrightShift=a>>2;finalintleftShift =a<<2;finalintunsignedRightShift = a >>> 2;
• Kotlin
  val andResult = a and bval orResult = a or bval xorResult = a xor bval rightShift = a shr 2val leftShift = a shl 2val unsignedRightShift = a ushr 2

5.类型判断和转换 (声明式)

• Java
if (object instanceof Car) {
Car car = (Car) object;}

• Kotlin
if (object is Car) {var car = object as Car}

6.类型判断和转换 (隐式)

• Java

if (object instanceof Car) {
   Car car = (Car) object;
}
• Kotlin
if (object is Car) {
var car = object // 聪明的转换
}

7.字符串模版

Kotlin 中引入了字符串模版,方便字符串的拼接,可以用$符号拼接变量和表达式
/** kotlin 字符串模版,可以用$符号拼接变量和表达式* */fun testString2() { val strings = arrayListOf("abc", "efd", "gfg")
println("First content is $strings")
println("First content is ${strings[0]}")
println("First content is ${if (strings.size > 0) strings[0] else "null"}") 
/** Kotlin 中,美元符号$是特殊字符,在字符串中不能直接显示,必须经过转义,方法 1 是用反斜杠, 方法二是${'$'}* */fun testString3() {
    println("First content is \$strings")
    println("First content is ${'$'}strings")
}

8.三个引号


    public void testString1() {
        String str1 = "abc";
        String str2 = "line1\n" +
"line2\n" +
                "line3";
        String js = "function myFunction()\n" +
"{\n" +
                "    document.getElementById(\"demo\").innerHTML=\"My First
JavaScript Function\";\n" +
                "}";
        System.out.println(str1);
        System.out.println(str2);
        System.out.println(js);
    }
/** kotlin 对字符串的加强,三个引号"""中可以包含换行、反斜杠等等特殊字符* */fun testString() {
val str1 = "abc"
val str2 = """line1\n line2 line3 """ val js = """ function myFunction()
{            document.getElementById("demo").innerHTML="My First JavaScript
    
kotlin 除了有单个双引号的字符串,还对字符串的加强,引入了三个引号,"""中可以包含换
行、反斜杠等等特殊字符:
 
Function";
}        """.trimIndent()
println(str1)
    println(str2)
    println(js)
}

9.let 语句简化对可空对象对访问

• let 函数原型:

inline fun <T, R> T.let(block: (T) -> R): R = block(this)

• let 函数默认当前这个对象作为闭包的 it 参数,返回值是函数里面最后一行,或者指
定 return。
上面的代码还可以用?.let 语句进行,如下所示:
/* * 通过 let 语句,在?.let 之后,如果为空不会有任何操作,只有在非空的时候才会执行 let
之后的操作 * */

 user?.let {
 it.name
 it.age
 it.toString()
 }

通过 let 语句,在?.let 之后,如果为空不会有任何操作,只有在非空的时候才会执行 let 之
后的操作

10.Elvis 操作符 ?: 简化对空值的处理

如果值可能为空,对空值的处理可能会比较麻烦,像下面这样:

/** 对空值的处理* */

fun testElvis(input: String?, user: User?) {
 val a: Int?
 if (input == null) {
 a = -1
 } else {
 a = input?.length
 }
 if (user == null) {
 var newOne = User()
 newOne.save()
 } else {
 user.save()
 }
}

Elvis 操作符?:能够简化上面的操作,?:符号会在符号左边为空的情况才会进行下面的处理,
不为空则不会有任何操作。跟?.let 正好相反,例如我们可以用两行代码来简化上面从操作:
/** * Elvis 操作符 ?: 简化对空值的处理 */

fun testElvis2(input: String?, user: User?) {
 val b = input?.length ?: -1;
 user?.save() ?: User().save()
}

11.可空类型和不可空类型

Java 中分受检异常和非受检异常,NullPointerException 是非受检异常,也就是说 NullPointerException 不需要显示的去 catch 住,往往在运行期间,程序就可能报出一个 NullPointerException 然后 crash掉,Kotlin 作为一门高效安全的语言,它尝试在编译阶段就把空指针问题显式的检测出来,把问题留在了编译阶段,让程序更加健壮。
• Kotlin 中类型分为可空类型和不可空类型,通过?代表可空,不带?代表不可为空

fun testNullType() {
 val a: String = "aa"
 /* * a 是非空类型,下面的给 a 赋值为 null 将会编译不通过 * */
 // a = null
 a.length
 /* * ?声明是可空类型,可以赋值为 null * */
 var b: String? = "bb"
 b = null

 /* * b 是可空类型,直接访问可空类型将编译不通过,需要通过?.或者!!.来访问 * */
 // b.length
 b?.length
 b!!.length
}

• 对于一个不可为空类型:如果直接给不可为空类型赋值一个可能为空的对象就在编
译阶段就不能通过
• 对于一个可空类型:通过?声明,在访问该类型的时候直接访问不能编译通过,需
要通过?.或者!!.
o ?. 代表着如果该类型为空的话就返回 null 不做后续的操作,如果不为空的
话才会去访问对应的方法或者属性
o !!. 代表着如果该类型为空的话就抛出 NullPointerException,如果不为空就
去访问对应的方法或者属性, 所以只有在很少的特定场景才用这种符号,
代表着程序不处理这种异常的 case 了,会像 java 代码一样抛 出
NullPointerException。 而且代码中一定不用出现下面这种代码,会让代码
可读性很差而且如果有空指针异常,我们也不能马上发现是哪空了:

 /* * 不推荐这样的写法:链式的连续用!!. * */
 val user = User()
 user!!.name!!.subSequence(0,5)!!.length

对应一个可空类型,每次对它的访问都需要带上?.判断

val user: User? = User()
 /* * 每次访问都用用?.判断 * */
 user?.name
 user?.age
 user?.toString()
但这样多了很多代码,kotlin 做了一些优化,
 /* * 或者提前判断是否为空,如果不为空在这个分支里会自动转化为非空类型就可以直接访问了
* */
 if (user != null) {
 user.name
 user.age
 user.toString()
 }

通过 if 提前判断类型是否为空,如果不为空在这个分支里会自动转化为非空类型就可以直接访问了。

猜你喜欢

转载自blog.csdn.net/github_37610197/article/details/125398335
今日推荐