我是Kotlin的初学者,我希望在以下数据结构中通过_id获取一个对象,所以我写了fun getMDetailByID(aMDetailsList:MDetailsList, _id:Long)...
这是一种传统的方法。
但我认为这种乐趣太复杂了,有一种简单的方法吗?例如使用Lambda表达式。
class UIMain : AppCompatActivity() {
data class BluetoothDef(val Status:Boolean=false)
data class WiFiDef(val Name:String, val Status:Boolean=false)
data class MDetail (
val _id: Long,
val bluetooth: BluetoothDef,
val wiFi:WiFiDef
)
data class MDetailsList(val mListMetail: MutableList<MDetail>)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.layout_main)
var mBluetoothDef1=BluetoothDef()
var mWiFiDef1=WiFiDef("MyConnect 1",true)
var aMDetail1= MDetail(5L,mBluetoothDef1,mWiFiDef1)
var mBluetoothDef2=BluetoothDef(true)
var mWiFiDef2=WiFiDef("MyConnect 2")
var aMDetail2= MDetail(6L,mBluetoothDef2,mWiFiDef2)
val mListMetail:MutableList<MDetail> = mutableListOf(aMDetail1,aMDetail2)
var aMDetailsList=MDetailsList(mListMetail)
var c=getMDetailByID(aMDetailsList,5L)
}
fun getMDetailByID(aMDetailsList:MDetailsList, _id:Long):MDetail?{
var aMDetail: MDetail?=null
var a=aMDetailsList.mListMetail
for (b in a){
if (b._id==_id){
aMDetail=b
}
}
return aMDetail
}
}
答案 0 :(得分:1)
确实有一种使用lambdas的简单方法。您可以通过以下方式替换您的功能代码:
fun getMDetailByID(aMDetailsList: MDetailsList, _id: Long): MDetail? {
return aMDetailsList.mListMetail.filter { it._id == _id }.lastOrNull()
}
它将像您的实现一样返回最后一个匹配元素,如果没有,则返回null。
答案 1 :(得分:1)
更简单的代码可以是:
fun getMDetailByID(aMDetailsList: MDetailsList, _id: Long) = aMDetailsList.mListMetail.filter { it._id == _id }.lastOrNull()
答案 2 :(得分:1)
更快,更简单的替代当前答案(它也比原始代码更好,因为它并不总是需要遍历整个列表):
SELECT f.Titel, ROUND(TIME_TO_SEC(Laufzeit)/60)
FROM film f
WHERE f.Erscheinungsjahr >= 1980 ORDER BY f.Titel ASC
另外,请考虑一下您是否真正将fun getMDetailByID(aMDetailsList: MDetailsList, _id: Long) =
aMDetailsList.mListMetail.findLast { it._id == _id }
定义为类而不是直接使用MDetailsList
或将其设置为类型。在某些情况下,您确实需要这种类型,但它们并不常见。