是否有一种简单的方法可以在Kotlin中通过_id获取对象?

时间:2017-11-17 08:10:18

标签: kotlin

我是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

    }

}

3 个答案:

答案 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或将其设置为类型。在某些情况下,您确实需要这种类型,但它们并不常见。