作者語
kotlin作為Google指定的Android開發(fā)語言在未來替代java已經(jīng)成為大勢所趨,而我們Android相關(guān)的從業(yè)人員就非常有必要緊跟技術(shù)革新俏讹,爭取不讓自己掉隊。 今天抽時間學(xué)習(xí)了一下Kotlin的相關(guān)知識,晚上便從自己的角度歸納一些知識點和運用上的重點盗扒。
基本語法
- “extends”跪楞、“implement”使用“:”代替
class MainActivity : AppCompatActivity(){}
- 變量的名稱和類型位置互換 ,需要注意的是Kotlin內(nèi)部都是Double侣灶、Int等對象甸祭, 不使用double、int等基本類型
var name :String="周萬磊"
- 方法寫法也有了一些變化褥影,重寫的方法池户,最前面需要加上override 具體格式如下
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
以上是沒有返回值的默認寫法,Unit表示沒有返回值,可以省略
override fun onCreate(savedInstanceState: Bundle?):Unit {
super.onCreate(savedInstanceState)
}
- kotlin定義時不必指定具體的對象類型凡怎,其類型會根據(jù)上下文推斷出來
- 定義一個變量 var a=11
- 定義一個常量 val b=11
- kotlin的便利性中特別重要的一點是我們不在需要通過復(fù)雜的get校焦、set方法獲取成員屬性
例如我們常常需要在fragment中獲取所在activity的context只需要
LinearLayoutManager(activity);
- 安全調(diào)用 kotlin語法中尤其出色的一點便是它對空對象的處理
任何對象不能直接賦值為null
比如
val a:String=null 會直接編譯不通過
當(dāng)然我們可以使用?符號,設(shè)置一個變量可能為null
val ok : String? = null
如果代碼中操作可能為null的變量统倒,那么只有在此變量不為null的時候才會調(diào)用該代碼寨典,否則會直接跳過
val context : Context? = null
val res = context?.getResources()
如果我們想要避免大面積的判空處理,最好的做法是在第一次可能為空值時進行一次判空處理房匆,確保內(nèi)部代碼中的變量都不會為null
val context : Context? = null
if (context != null) {
val res = context.getResources() // 不需要 '?'
val appName = res.getString(R.string.app_name)
val shortName = appName.substring(0, 2)
}
- 選擇操作符?:
log.e(msg,e.getMessage?:"沒有打印信息")
這個操作符的功能類似于java中的三元操作符
log.e(msg,e.getMessage!=null?e.getMessage:"沒有打印信息")
- 與java相比耸成,kotlin的語法簡化了許多,去除了static關(guān)鍵字浴鸿、語句結(jié)尾的“;”等
如果我們有一個靜態(tài)的常量井氢,正確的寫法如下
companion object {
val LOADING=1
val NEWS: Int=2
}
實際運用中的一些新的語法點
掌握以上的基本語法,就可以滿足項目中的大部分代碼書寫岳链,但是kotlin吸引我的地方不止于此花竞,他還有一些java所沒有的亮點是我必須花精力去學(xué)習(xí)的原因
- 擴展函數(shù) 我們可以為一個類添加函數(shù)來拓展該類,這個類是任意的宠页,我們不需要繼承
fun ViewGroup.inflate(layoutId: Int,attachToRoot: Boolean = false): View {
return LayoutInflater.from(context).inflate(layoutId, this, false)
}
在這里我們?yōu)閂iewGroup添加了一個inflate方法來簡化我們的填充布局操作左胞,定義這個擴展函數(shù)以后寇仓,我們項目內(nèi)所有的ViewGroup的子類都可以采用該方法添加布局
例如:
container?.inflate(R.layout.news_fragment)
2.Android Extensions 這里我的理解是可以簡化我們的findviewbyid操作举户,有沒有其他用途,后面的學(xué)習(xí)工程中如果發(fā)現(xiàn)我會繼續(xù)追加到這里
首先我們需要在build.gradle中添加如下插件
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
然后在當(dāng)前類中
import kotlinx.android.synthetic.main.news_fragment.*
代碼中就可以這樣使用layout中定義的“@+id/tv_login”的控件
tv_login.setText("登錄")遍烦,而不需要去重新尋找控件
3.Lazy (委托屬性) Lazy代碼塊我的理解上就相似于java中的單例模式俭嘁,只會在第一次使用時初始化,避免了為空的情況
private val newsList by lazy {
news_list.setHasFixedSize(true)
news_list.layoutManager = LinearLayoutManager(context)
news_list
}
- Init構(gòu)造器 kotlin中Init代碼塊表示的是一個類的構(gòu)造函數(shù)
init {
items = ArrayList()
items.add(loadingItem)
}
5.對象表達式
類似于java中的匿名內(nèi)部類服猪,無需重新創(chuàng)建類供填,便可以生成一個類的子類
private val loadingItem = object : ViewType {
override fun getViewType(): Int = AdapterConstants.LOADING
}
6.kotlin中我最喜歡的一個功能,便是對象類的創(chuàng)建罢猪,不再跟以前一樣是長篇的get近她,set方法,只需要短短一行膳帕,就可以創(chuàng)建一個功能完備的對象類
data class RedditNewsItem(var author: String, var title: String) {}
7.一些有意思的操作符
- Range 使用”1..10”這樣簡單的表達式粘捎,就可以創(chuàng)建一個范圍的數(shù)字
for(i in 1..10){
...
}
- mutableListOf
返回一個可修改的集合
val ints = mutableListOf<Int>()
- Lists 函數(shù) & Lambdas
fun getNews(): List<RedditNewsItem> {
return items.filter {
it.getViewType() == AdapterConstants.NEWS
}.map {
it as RedditNewsItem
}
}
- filter
filter可用來過濾薇缅,用法應(yīng)該是參考了rxjava中filter操作符
- map
map則是對集合中的每一項進行一些操作,上例中是將it的類型做了轉(zhuǎn)化
結(jié)束語
以上就是我今天學(xué)習(xí)過程中對kotlin的基礎(chǔ)知識總結(jié)攒磨,第一次寫技術(shù)博客泳桦,難免有所疏漏或者不正確的地方,歡迎指正娩缰,以后我會把自己的學(xué)習(xí)過程更多的記錄下來灸撰,不僅是加深自己知識點的印象,也希望能夠結(jié)識更多和我一樣熱愛技術(shù)的小伙伴拼坎。