Kotlin學(xué)習(xí)之路

作者語

kotlin作為Google指定的Android開發(fā)語言在未來替代java已經(jīng)成為大勢所趨,而我們Android相關(guān)的從業(yè)人員就非常有必要緊跟技術(shù)革新俏讹,爭取不讓自己掉隊。 今天抽時間學(xué)習(xí)了一下Kotlin的相關(guān)知識,晚上便從自己的角度歸納一些知識點和運用上的重點盗扒。

基本語法

  1. “extends”跪楞、“implement”使用“:”代替
class MainActivity : AppCompatActivity(){}

  1. 變量的名稱和類型位置互換 ,需要注意的是Kotlin內(nèi)部都是Double侣灶、Int等對象甸祭, 不使用double、int等基本類型
  var name :String="周萬磊"

  1. 方法寫法也有了一些變化褥影,重寫的方法池户,最前面需要加上override 具體格式如下
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }
    以上是沒有返回值的默認寫法,Unit表示沒有返回值,可以省略
     override fun onCreate(savedInstanceState: Bundle?):Unit {
        super.onCreate(savedInstanceState)
    }

  1. kotlin定義時不必指定具體的對象類型凡怎,其類型會根據(jù)上下文推斷出來
- 定義一個變量 var a=11
- 定義一個常量 val b=11

  1. kotlin的便利性中特別重要的一點是我們不在需要通過復(fù)雜的get校焦、set方法獲取成員屬性
例如我們常常需要在fragment中獲取所在activity的context只需要
LinearLayoutManager(activity);

  1. 安全調(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)
}

  1. 選擇操作符?:
   log.e(msg,e.getMessage?:"沒有打印信息")
  這個操作符的功能類似于java中的三元操作符
  log.e(msg,e.getMessage!=null?e.getMessage:"沒有打印信息")

  1. 與java相比耸成,kotlin的語法簡化了許多,去除了static關(guān)鍵字浴鸿、語句結(jié)尾的“;”等
    如果我們有一個靜態(tài)的常量井氢,正確的寫法如下
 companion object {
        val LOADING=1
        val NEWS: Int=2
    }

實際運用中的一些新的語法點

掌握以上的基本語法,就可以滿足項目中的大部分代碼書寫岳链,但是kotlin吸引我的地方不止于此花竞,他還有一些java所沒有的亮點是我必須花精力去學(xué)習(xí)的原因

  1. 擴展函數(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
 }

  1. 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ù)的小伙伴拼坎。

參考資料

技術(shù)邊界

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末浮毯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子泰鸡,更是在濱河造成了極大的恐慌亲轨,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸟顺,死亡現(xiàn)場離奇詭異惦蚊,居然都是意外死亡,警方通過查閱死者的電腦和手機讯嫂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門蹦锋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人欧芽,你說我怎么就攤上這事莉掂。” “怎么了千扔?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵憎妙,是天一觀的道長。 經(jīng)常有香客問我曲楚,道長厘唾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任龙誊,我火速辦了婚禮抚垃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘趟大。我一直安慰自己鹤树,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布逊朽。 她就那樣靜靜地躺著罕伯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪叽讳。 梳的紋絲不亂的頭發(fā)上追他,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天熊昌,我揣著相機與錄音,去河邊找鬼湿酸。 笑死婿屹,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的推溃。 我是一名探鬼主播昂利,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼铁坎!你這毒婦竟也來了蜂奸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤硬萍,失蹤者是張志新(化名)和其女友劉穎扩所,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體朴乖,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡祖屏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了买羞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袁勺。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖畜普,靈堂內(nèi)的尸體忽然破棺而出期丰,到底是詐尸還是另有隱情,我是刑警寧澤吃挑,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布钝荡,位于F島的核電站,受9級特大地震影響舶衬,放射性物質(zhì)發(fā)生泄漏埠通。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一约炎、第九天 我趴在偏房一處隱蔽的房頂上張望植阴。 院中可真熱鬧蟹瘾,春花似錦圾浅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至众雷,卻和暖如春灸拍,著一層夾襖步出監(jiān)牢的瞬間做祝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工鸡岗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留混槐,地道東北人。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓轩性,卻偏偏與公主長得像声登,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子揣苏,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,614評論 2 353