kotlin类型 非空 和空类型的处理
/**
* 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()
}