距離我上次寫kotlin的代碼已經(jīng)過去了三個(gè)多月,前兩天在寫測試代碼的時(shí)候,寫了幾個(gè)lambda表達(dá)式,回頭發(fā)現(xiàn)這個(gè)跟kotlin的高階函數(shù)還不一樣,怎么寫來著給忘了.果然是技術(shù)只要不使用,遺忘的速度讓人吃驚.
kotlin新的東西其實(shí)很多,google的社區(qū)或者kotlin的中文站都有大量的細(xì)節(jié)知識,可以從頭到尾了解學(xué)習(xí).不過從java轉(zhuǎn)到kotlin都是直接上手,一邊寫一遍查.
個(gè)人覺得google官方這份31天學(xué)習(xí)kotlin的文章,可以說詳細(xì)而簡單.demo簡潔有力.
31 天,從淺到深輕松學(xué)習(xí) Kotlin
下面是kotlin里邊在項(xiàng)目中比較常用的東西,也是直接使用中感覺最便捷的地方.做個(gè)記錄.
1.比java占位符更好用擴(kuò)展的字符串拼接
var prefix = 1
var subfix = UserInfo("lily", "japan", 3, "no")
var str = "here is a user $prefix ${subfix.name}"http://here is a user 1 lily
str = """ she is "${subfix.name}" """ // she is "lily"
2.空指針推斷
//java
List<T> mData = null;
public int getItemCount(){
return mData == null ? 0:mData.size();
}
//kotlin
var mData: List<T>? = null
override fun getItemCount(): Int {
return mData?.size ?: 0
}
//java
String deptId = null;
if(LuckinBaseData.getInstance().getShopInfo()!=null &&
LuckinBaseData.getInstance().getShopInfo().deptInfo != null){
deptId = LuckinBaseData.getInstance().getShopInfo().deptInfo.deptId;
}
//kotlin
var deptId = LuckinBaseData.getInstance().getShopInfo()?.deptInfo?.deptId
3.方法的默認(rèn)參數(shù)減少重載,這里最好的例子應(yīng)該是View的四個(gè)構(gòu)造方法
class SimpleAdapter<T>(context: Context = BaseApplication.getInstance() , parent: RecyclerView) {
fun testM(var i = 1;var j = 2){
Log.d("test","${i+j}")
}
}
var simpleAdapter1 = SimpleAdapter(Activity.this,rv_content)
var simpleAdapter2 = SimpleAdapter(parent = rv_content)
simpleAdapter1.testM()//1+2 = 3
simpleAdapter1.testM(3,4)//3+ 4 = 7
simpleAdapter1.testM(5)//5+2 = 7
simpleAdapter1.testM(j = 6)//1+6 = 7
4.高階函數(shù)的支持,不在需要通過接口進(jìn)行行為(方法)的傳遞,方法可以像變量傳遞
class SimpleAdapter<UserInfo>(context: Context , parent: RecyclerView) {
var onItemClick: ((Int) -> Unit)? = null
override fun onBindViewHolder(holder: SimpleViewHolder, pos: Int) {
//這里的代碼有些臃腫以及不必要,我只是為了test demo
val userInfo = mData!![pos] as UserInfo
userInfo.apply {
holder.itemView.tv_info.text = "$id $name $address"
holder.itemView.setOnClickListener {
onItemClick?.run {
this(pos)
}
}
}
}
}
var simpleAdapter1 = SimpleAdapter(Activity.this,rv_content)
simpleAdapter1.onItemClick = {
Toast.makeText(baseContext, "click -- $it", Toast.LENGTH_SHORT).show()
}
5.通過插件擴(kuò)展直接使用View的id在類文件中使用View對象
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_kotlin_test)
tv_name.text = "tv_name無需聲明直接使用"
}
override fun onBindViewHolder(holder: SimpleViewHolder, pos: Int) {
val userInfo = mData!![pos] as UserInfo
userInfo.apply {
holder.itemView.tv_info.text = "tv_info也可以不用findViewById"
holder.itemView.setOnClickListener {
onItemClick?.let {
it(pos)
}
}
}
}
kotlin的高階函數(shù)
C語言的方法變量
Java8的Lambda表達(dá)式
Groovy的閉包.
以及母豬的產(chǎn)后護(hù)理.
我這個(gè)知識啊,都學(xué)雜了.