kotlin类型 非空 和空类型的处理

/**
 * Created by gacmy on 2017/6/15.
 */
fun strLen(s:String) = s.length//会产生编译错误 空指针异常
//fun strLenSafe(s: String?) = s.length // 类型后面加? 表明它可以为空值 但是你不能直接调用它的方法 否则会报错
fun strLenSafe(s: String?):Int{//你必须判空
    if(s == null){
        return 0
    }
    s?.toUpperCase()//等同于下面的语句 类调的实例调用方法 加上? 则不是空则正常调用 是空值则返回空
    if(s!=null) s.toUpperCase() else null

      return s.length
}


fun strLenSafe1(s: String):Int{//你必须判空
    if(s == null){
        return 0
    }
    s?.toUpperCase()//等同于下面的语句 类调的实例调用方法 加上? 则不是空则正常调用 是空值则返回空
    if(s!=null) s.toUpperCase() else null

    return s.length
}
val x:String? = null
//var y:String = x;//你不可以赋值给一个变量空值的类型

class Employee(val name: String, val manager: Employee)

fun managerName(employee: Employee): String? = employee.manager?.name

class Address(val streetAddress: String, val zipCode: Int, val city:String, val county: String)
class Company(val name: String, val address:Address?)
class Person1(val name: String, val company: Company?)

fun Person1.countyName(): String{
    val country = this.company?.address?.county
    return if(country != null) country else "Unknown"
}

//变量空值的时候 默认赋值 ?:
fun foo(s : String?){
    val t: String = s ?: ""
}


fun strLenSafe2(s :String?): Int = s?.length ?: 0

fun Person1.countyName1(): String{
    val country = this.company?.address?.county ?: "Unkonwn"
    return country
}


fun printShippingLabel(person: Person1){
    val address = person.company?.address ?: throw IllegalArgumentException("No address")//抛出异常
    with(address){
        println(streetAddress)
        println("$zipCode $city, $county")
    }
}
//as? 类型安全转换 转换不成功就是空值
class Person2(val firstName: String, val lastName: String){
    override fun equals(other: Any?): Boolean {
        val otherPerson = other as? Person2 ?: return false
        return otherPerson.firstName == firstName && otherPerson.lastName == lastName
    }

    override fun hashCode(): Int = firstName.hashCode()*37 + lastName.hashCode()
}
//如果空值 就抛出空指针异常// 只有你确定这个值肯定不是空值的时候 才会使用这个符号
fun ignoreNulls(s: String?){
    val sNotNull: String = s!!
    println(sNotNull.length)
}

//let 函数 当一个空为值的时候什么也不执行 不为空执行一个函数
fun sendEmailTo(email: String){
    println("Sending email to $email")
}
fun getTheBesPersonInTheWorld() : Person? = null


fun testLet(){
    val email:String? = "";
    email?.let { email -> sendEmailTo(email) }

    email?.let { sendEmailTo(it) }
    getTheBesPersonInTheWorld()?.let { sendEmailTo(it.name) }

}

//所有类的参数 和函数的参数默认都 type? 类型
fun <T> printHashCode(t: T){
    println(t?.hashCode())
}
//T的类型 Any?

fun <T: Any>printHashCode1(t: T){//T 限定了Any类型  所以会产生编译错误 T为非空类型
    println(t.hashCode())
}

//java 空值 和 kotlin空值类型 相互转换  @Nullable String = String?   @NotNull String = String


//kotlin 没有原始类型 java int float double kotlin 的类型 都是引用类型
//但是编译器 会分情况处理,如果你的Int 值是函数返回值 它会将Int 作为int 处理 ,List<Int> 就会将它作为包装类Integer处理
//如果你将原始类型 作为类的参数类型 kotlin 将他作为包装类型 你想在集合里面使用原始类型 可以使用第三方库 Trove4J
fun Person.isOrderThan(other: Person) :Boolean?{
    if(age == null || other.age == null){
        return null
    }
    return age > other.age
}

fun testConversion(){
    val i = 1
 //   val k: Long = i 转换错误 int 类型不能转为long
    //你需要显示调用toType函数
    val k: Long = i.toLong()
//在java 里面new Integer(42).equals(new Long(42)) return false
    val x = 1
    val list = listOf(1L,2L,3L)
    //x in list 编译器不会通过 类型错误
    x.toLong() in list //你需要做显示的转换
    //在kotlin 里面 Long 类型: 123L    Double 类型:0.12 2.0 1.2e10 1.2e-10
    //Float 类型 123.4f
    //二进制类型 0b 或者 0B
    //十六进制类型 0x 或者0X 例如 0xCA  0Xca
    //字符类型 '1' '/t'  '/u0009'

    //kotlin 有的情况 会自动转换类型 例如 数字类型不需要加后缀和前缀
    fun foo(l: Long) = println(l)
    val b: Byte = 1
    val l = b+1L
    foo(42)


}

//Any类型 是所有对象的父类 (非空对象)
//Any? 是所有对象的父类 (Type?)
val answer:Any = 43 //any 类型 会自动识别你声明的类型
//Any 类型最后会被编译为 java 的Object类型 它的通用方法 toString equals hashCode
//如果你想使用 wait notify Object的方法 你需要将Any类型转换为Object类型

//Unit类型 相当于void 类型

fun f(): Unit{}
fun f1(){}//这两种写法都是可以的

interface Processor<T>{
    fun process(): T
}
class NoResultProcessor: Processor<Unit>{
    override fun process() {

    }
}


//Nothing 类型 函数永远不返回值

//一个函数 抛出异常 或者 死循环 就不会返回类型
fun fail(message: String): Nothing
{
    throw IllegalArgumentException(message)
}

fun testNothing(){
    val company = Company("name",Address("ff",2,"city","county"))
    val address = company.address ?: fail("No address")
    print(address.city)
}











































猜你喜欢

转载自blog.csdn.net/gacmy/article/details/73331298