Search code examples
listkotlindictionaryflatmap

Getting list of 1st elements from a list?


I have the following data class

data class AdDetails(val adMedia: List<AdMedia>)

data class AdMedia(val adMetaInfo: AdMetaInfo, val adUri:List<AdUri>)
data class AdUri(val width:Int,val height:Int,val uri:String)
data class AdMetaInfo(var adTitle: String, var adId: String)

This is the smaple data

AdDetails(adMedia=[AdMedia(adMetaInfo=AdMetaInfo(adTitle=1, adId=1), 
adUri=[AdUri(width=640, height=360, uri=adUrl1), 
AdUri(width=426, height=240, uri=url3)])])

AdDetails(adMedia=[AdMedia(adMetaInfo=AdMetaInfo(adTitle=2, adId=2), 
adUri=[AdUri(width=640, height=360, uri=adUrl2), 
AdUri(width=426, height=240, uri=url3)])])

From this I want list of only 1st ad URI - adUrl1 , adUrl2

I am using map / flatmap for this but not getting desired output

 val preRollUri=preRollAdDetails.adMedia.flatMap { it.adUri.map { it.uri } }

Solution

  • data class AdDetails(val adMedia: List<AdMedia>)
    data class AdMedia(val adMetaInfo: AdMetaInfo, val adUri: List<AdUri>)
    data class AdMetaInfo(var adTitle: String, var adId: String)
    data class AdUri(val width: String, val height: String, val uri: String)
    
    val details = AdDetails(
      listOf(
        AdMedia(
          AdMetaInfo("1", "1"),
          listOf(
            AdUri("640", "360", "adUrl1"),
            AdUri("426", "240", "url3")
          )
        ),
        AdMedia(
          AdMetaInfo("2", "2"),
          listOf(
            AdUri("640", "360", "adUrl2"),
            AdUri("426", "240", "url3")
          )
        ),
        AdMedia(
          AdMetaInfo("3", "3"),
          emptyList()
        )
      )
    )
    
    val result = details.adMedia.map { it.adUri.firstOrNull()?.uri }
    
    println(result)   // Output: [adUrl1, adUrl2, null]
    

    To filter out null values:

    val result = details.adMedia.map { it.adUri.firstOrNull()?.uri }.filterNotNull()
    
    println(result)   // Output: [adUrl1, adUrl2]
    

    If it is guaranteed that there won't be any empty list in any of the AdUris in any of the AdMedias, the following will do (but would crash if there is an empty list):

    val result = details.adMedia.map { it.adUri.first().uri }