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

时间:2025-02-08 15:34:49
/** * Created by gacmy on 2017/6/15. */ fun strLen(s:String) = //会产生编译错误 空指针异常 //fun strLenSafe(s: String?) = // 类型后面加? 表明它可以为空值 但是你不能直接调用它的方法 否则会报错 fun strLenSafe(s: String?):Int{//你必须判空 if(s == null){ return 0 } s?.toUpperCase()//等同于下面的语句 类调的实例调用方法 加上? 则不是空则正常调用 是空值则返回空 if(s!=null) () else null return } fun strLenSafe1(s: String):Int{//你必须判空 if(s == null){ return 0 } s?.toUpperCase()//等同于下面的语句 类调的实例调用方法 加上? 则不是空则正常调用 是空值则返回空 if(s!=null) () else null return } val x:String? = null //var y:String = x;//你不可以赋值给一个变量空值的类型 class Employee(val name: String, val manager: Employee) fun managerName(employee: Employee): String? = ?.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 (): String{ val country = ?.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 = ?.address?.county ?: "Unkonwn" return country } fun printShippingLabel(person: Person1){ val address = ?.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 == firstName && == lastName } override fun hashCode(): Int = ()*37 + () } //如果空值 就抛出空指针异常// 只有你确定这个值肯定不是空值的时候 才会使用这个符号 fun ignoreNulls(s: String?){ val sNotNull: String = s!! println() } //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() } } //所有类的参数 和函数的参数默认都 type? 类型 fun <T> printHashCode(t: T){ println(t?.hashCode()) } //T的类型 Any? fun <T: Any>printHashCode1(t: T){//T 限定了Any类型 所以会产生编译错误 T为非空类型 println(()) } //java 空值 和 kotlin空值类型 相互转换 @Nullable String = String? @NotNull String = String //kotlin 没有原始类型 java int float double kotlin 的类型 都是引用类型 //但是编译器 会分情况处理,如果你的Int 值是函数返回值 它会将Int 作为int 处理 ,List<Int> 就会将它作为包装类Integer处理 //如果你将原始类型 作为类的参数类型 kotlin 将他作为包装类型 你想在集合里面使用原始类型 可以使用第三方库 Trove4J fun (other: Person) :Boolean?{ if(age == null || == null){ return null } return age > } fun testConversion(){ val i = 1 // val k: Long = i 转换错误 int 类型不能转为long //你需要显示调用toType函数 val k: Long = () //在java 里面new Integer(42).equals(new Long(42)) return false val x = 1 val list = listOf(1L,2L,3L) //x in list 编译器不会通过 类型错误 () 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 = ?: fail("No address") print() }

相关文章