kotlin在處理數字時與java類似,但又不完全相同.
例如在數字沒有隱式拓展;
有些情況下的字面值有所不同;
在kotlin中字符不是數字;
Double64
Float 32Long64
Int 32Short16Byte8
十進制: 123Long類型:123L
十六進制:0x01
二進制:0b11011000
不支持八進制
Double:123.5
Float:123.5f
可以使用下劃線增加數組的可讀性
val oneMillion=1_000_000
在 Java 平臺數字是物理存儲爲 JVM 的原生類型,除非我們需要一個可空的引用(如
Int? )或泛型。 後者情況下會把數字裝箱。
fun box(v:View){
val a:Int =10000
Log.d("meee",""+(a === a));
val b:Int?=a;
val c:Int?=a;
Log.d("meee",""+(b === c));//注意,裝箱後不保證同一性,這裏爲false//但會保持數字的相等
Log.d("meee",""+(b == c));//true//假設代碼,實際上不能被編譯//Long 和Int即使值相等也不能陪判斷爲==val ten:Int? =10;
val tenL:Long?=ten;
Log.d("meee",""+(a==b));//false//所以同一性還有相等性都會在所有地方悄無聲息地失去
}
顯式轉換
toByte(): BytetoShort(): ShorttoInt(): InttoLong(): LongtoFloat(): FloattoDouble(): DoubletoChar(): Char val byte:Byte=1/* //不能通過編譯
val int:Int=byte*///顯式轉換
val int:Int=byte.toInt()
相等性檢測: a == b 與 a != b
比較操作符: a < b 、 a > b 、 a <= b 、 a >= b
區間實例以及區間檢測: a..b 、 x in a..b 、 x !in a..b
fun calculate(v:View){
val num=0b1101_1000
Log.d("meee",""+num);//216
val num2=num shl 1
Log.d("meee",""+num2);//432
Log.d("meee",""+(0.9 in 1..10));
}
字符
字符用 Char 類型表示。它們不能直接當作數字
fun myChar(v:View){
val char:Char='a'
Log.d("meee","char:"+char);//a
/* //編譯錯誤,類型不同不能判斷
Log.d("meee",""+(char == 97));*/
//可以對char進行顯式轉換
Log.d("meee",""+(char.toInt() == 97));//true
}
數組在 Kotlin 中使用 Array 類來表示,它定義了 get 和 set 函數(按照運算符重載約定
這會轉變爲 [] )和 size 屬性,以及一些其他有用的成員函數:
classArray<T> privateconstructor(){
val size: Int
operator fun get(index: Int): T
operator fun set(index: Int, value: T): Unit
operator fun iterator(): Iterator<T>
// ……
}
fun myArray(v:View){
//創建方式一
val numArray= arrayOf(1,2,3)
Log.d("meee",""+numArray[0]);//1,[]代表數組的get set
Log.d("meee",""+numArray[1]);//2
Log.d("meee",""+numArray[2]);//3//創建一個大小爲3空數組
var nullArray= arrayOfNulls<String>(3)
//創建方式二
val asc=Array(5,{i -> (i*i).toString()})//i爲0 1 2 3 4
Log.d("meee",""+asc[0]);
Log.d("meee",""+asc[1]);
Log.d("meee",""+asc[2]);
Log.d("meee",""+asc[3]);
Log.d("meee",""+asc[4]);
/*與 Java 不同的是,Kotlin 中數組是不型變的(invariant)。這意味着 Kotlin 不讓我們把
*Array<String> 賦值給 Array<Any> ,以防止可能的運行時失敗*/
}
fun testIf(v:View){
val a=1;
val b=2if(a<b){
Log.d("meee","a<b");
}
if (b<a){
}else{
Log.d("meee","b>a");
}
//在kotlin中 if 是一個表達式,即它會返回一個值//如果爲代碼塊,則最後爲該塊的值//if 作爲表達該表達式需要有 else 分支。varmin=if (a<b) {
Log.d("meee","= =")
a
} else {11.1}
Log.d("meee","min:"+min);//1
}
When
類似switch,
也可以作爲表達,同樣必須要有else分支
when (x) {
1 ->print("x == 1")
2 ->print("x == 2")
else -> { // 注意這個塊
print("x is neither 1 nor 2")
}
}
//如果很多分支需要用相同的方式處理,則可以把多個分支條件放在一起,用逗號分隔:
fun testWhen2(v:View){
varx:Int=3
val str=when(x){
1,3,5 ->"單數"2,4,6 ->"雙數"else ->"超出計算能力"
}
Log.d("meee",""+str);
}
//可以使用任意表達式作爲分支條件
fun testWhen2(v:View){
varx:Int=3
val str=when(x){
1,3,5 ->"單數"2,4,6 ->"雙數"//方法
getTen() ->"喲呵你還能輸入個10進來"//區間
in666..999 ->"666"//也可以通過類型判斷,並且會自動轉化,當然這裏是編譯不通過的
is String ->"string"else ->"超出計算能力"
}
Log.d("meee",""+str);
}
fun getTen():Int=10;
//when 也可以用來取代 if - elseif 鏈。 如果不提供參數,所有的分支條件都是簡單的布
爾表達式,而當一個分支的條件爲真時則執行該分支:
when {
x.isOdd() ->print("x is odd")
x.isEven() ->print("x is even")
else ->print("x is funny")
}
For
for 循環可以對任何提供迭代器(iterator)的對象進行遍歷,這相當於像 C# 這樣的語言中
的 foreach 循環。語法如下:
for (item in collection) print(item)
循環體可以是一個代碼塊。
for (item: Int in ints) {
// ……
}
如上所述, for 可以循環遍歷任何提供了迭代器的對象。即:
有一個成員函數或者擴展函數 iterator() ,它的返回類型
有一個成員函數或者擴展函數 next() ,並且
有一個成員函數或者擴展函數 hasNext() 返回 Boolean 。
這三個函數都需要標記爲 operator 。
//如果你想獲取數組或者集合的索引//注意這種“在區間上遍歷”會編譯成優化的實現而不會創建額外對象。//list
val list= ArrayList<String>()
list.add("你")
list.add("好")
list.add("啊")
for (index in0 until list.size){
Log.d("meee",""+list.get(index));
}
for ((index,value) in list.withIndex()){
Log.d("meee","index is $index,value is $value");
}
//數組
val arr= arrayOf("1","2","3")
for (i in arr.indices){
Log.d("meee",""+arr[i]);
}
for ((index,value)in arr.withIndex()){
Log.d("meee","index is $index,value is $value");
}
While doWhile
同java
返回和跳轉
Kotlin 有三種結構化跳轉表達式:
return 。默認從最直接包圍它的函數或者匿名函數返回。
break 。終止最直接包圍它的循環。
continue 。繼續下一次最直接包圍它的循環。
所有這些表達式都可以用作更大表達式的一部分:
val s = person.name ?: return//返回類型爲Nothing
標籤的使用
fun testLabel(v:View){
//labelName@創建標籤
loop@ for (x in1..100){
if (x%10==0){
//continue@loop跳過這次循環continue@loop
}
if (x==51){
//終止這次循環break@loop
}
Log.d("meee","x:"+x);
}
}
funct@{
//結束方法return@lit
}
//隱式標籤,該標籤與接受該lambda 的函數同名。
fun foo() {
ints.forEach {
if (it == 0) return@forEachprint(it)
}
}
//普通方法
fun add(a: Int, b: Int): Int {
returna + b
}
//將表達式作爲方法的返回值時,會自動判斷返回類型
fun add2(a: Int, b: Int) = a + b
局部常量
定義
val a:Int =1//自動推斷val b=1//沒有初始化則不能自動推斷,且只能被賦值一次,未賦值使用編譯報錯val c:Long
局部變量
var x:Int =1;
全局變量和常量
全局常量和變量與局部變量相同,但是必須在定義時初始化或抽象修飾
Lamdba的使用
button.setOnClickListener(object:View.OnClickListener{
override fun onClick(v: View?) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
})
button.setOnClickListener{view->
}
button.setOnClickListener{
}
字符串模版
var a:String="小黃"val saying="你是$a"//saying:你是小黃//{}內是代碼val saying2="你是${a.replace("小黃","老江")}"//saying2:你是老江
使用可空值
//返回類型可以爲null
fun getNull():Int?{
returnnull
}
public fun test(view:View){
var n=getNull()
//使用可空值時,必須進行非空判斷if (n!=null){
var x=n+1
Log.d("meee","x:"+x);
}
//或者空檢測if (n==null){
return;
}
}
fun testfor(view:View){
varlist:ArrayList<String>= ArrayList()
val list2= listOf<String>("你好","你好","你好");
list.add("你好啊")
list.add("你好啊")
list.add("你好啊")
list(list)
//不包括100
for (i in0 until 100){
Log.d("meee","哈哈"+i);//輸出至哈哈99
}
}
fun list(list:ArrayList<String>){
//類似增強型for循環了
for(item inlist){
Log.d("meee",item);
}
}
When表達式
//類似switch
fun getItemName(index:Int):String{
when(index){
0->return"Zero"1->return"One"2->return"Two"else->return"Null"//類似default
}
}
分號的作用
分割同一行的不同函數
Range
//使用in運算符來檢測某個數字是否在指定區間內
fun testRange(view:View){
Log.d("meee","38:"+isIn39to50(38));//falseLog.d("meee","39:"+isIn39to50(39));//trueLog.d("meee","49:"+isIn39to50(49));//trueLog.d("meee","50:"+isIn39to50(50));//trueLog.d("meee","38:"+isNotIn39to50(38));//trueLog.d("meee","39:"+isNotIn39to50(39));//falseLog.d("meee","49:"+isNotIn39to50(49));//falseLog.d("meee","50:"+isNotIn39to50(50));//false
}
fun isIn39to50(num:Int):Boolean{
if (num in39..50){
returntrue;
}
returnfalse;
}
fun isNotIn39to50(num:Int):Boolean{
if (num !in39..50){
returntrue;
}
returnfalse;
}
fun listMap(v:View){
val map=HashMap<Int,String>()
map.put(1,"小黃")
map.put(2,"老江")
map.put(3,"竈傑")
Log.d("meee","map:"+map);
for((k,v) inmap){
Log.d("meee","$k 映射 $v");
}
}
創建只讀list map
//創建只讀list mapfun readOnlyListAndMap(v:View){
val list= listOf<String>("1","2","3")
val map= mapOf<Int,Int>(1to100,2to300,3to1000)
}
ByLaze
fun ByLazy(v:View){
//第一次被調用時就被初始化,想要被改變只能重新定義,只能在val上使用val str:String by lazy { "你好啊" }
Log.d("meee","str:"+str);
}
拓展函數
fun String.addFun(){
Log.d("meee","= =");
}
fun String.toLowerCase(){
Log.d("meee","= =");
}
fun extendFunction(view:View){
"你好啊".addFun()
//如果存在同名的方法,則默認以覆蓋爲準
"s".toLowerCase()//Log.d("meee","= =");
}
單例
objectSingleInstance{val name="小黃"
}
fun singleInstance(v:View){
Log.d("meee","SingleInstance.name:"+SingleInstance.name);
Log.d("meee","SingleInstance:"+SingleInstance);
}
非空判斷的縮寫
//非空判斷的縮寫
fun notNull(v:View){
var str:String?=null//非空判斷執行對象的方法
str?.addFun()//不會執行addFun();//if not null
val str2="12"
str2?.let {
Log.d("meee","str2不爲空");
}
//if null
val str3:String?=null
str3?:Log.d("meee","str3爲空");
//if not null and else
val obj=str?.length?:"空的"Log.d("meee",""+obj);//"空的"
}
以When表達式爲返回值
fun returnWhen(v:View){
Log.d("meee",""+returnWhen("red"));
Log.d("meee",""+returnWhen("blue"));
Log.d("meee",""+returnWhen("unkonw"));
}
fun returnWhen(color:String):String{
return when(color){
"red"-> "紅色""green"-> "綠色""blue"-> "藍色"else-> "找不到該顏色"
}
}
try-cache表達式
fun tryCache(v:View){
var str=try {
throw RuntimeException("呵呵")
"你好啊"
}catch (e: RuntimeException){
}
Log.d("meee",""+(str==null));
}
對同一個對象調用多個方法>>With 關鍵字的使用
fun MutilMethodCall(v:View){
val tri=Tri()
with(tri){
//在with關鍵字內可以直接調用該對象的方法for(x in1..5){
add1()
add2()
add3()
}
}
}
class Tri(){
fun add1(){
Log.d("meee","side1");
}
fun add2(){
Log.d("meee","side2");
}
fun add3(){
Log.d("meee","side3");
}
}
FileIo流的使用方法(親測不行,找不到Files類)
val stream = Files.newInputStream(Paths.get("/some/file.txt"))
stream.buffered().reader().use { reader ->
println(reader.readText())
}
泛型返回值的使用
inline fun <reified T: Any> Gson.fromJson(json: JsonElement): T = this.fromJson(json,
T::class.java)
可空布爾值的使用
fun notBoolean(v:View){
val flag:Boolean?=nullif(flag==true){
Log.d("meee","true");
}else{
Log.d("meee","false or null");
}
}
同步方法
@Synchronized
fun getInstance():APP {
if(app==null){
app=APP()
}
return app as APP
}
靜態方法
//companion object表示伴隨object,也就是java的靜態方法的意思
companion object{
var app: APP? = null
@Synchronized
fun getInstance():APP {
if(app==null){
app=APP()
}
return app as APP
}
}