首页 > 解决方案 > 使用 Kotlin 函数特性如何使这段代码变得更好?

问题描述

我有这些代码,我不喜欢我有 mapNotNull 并且在里面我有其他返回 null 的案例,我认为我的 kotlin 知识不足以让它变得更好,有什么想法吗?

    return config.mainMenus.mapNotNull { mainMenu ->
      val subPage = config.subPages.find {
        if (mainMenu.actions.isNotEmpty()) {
          it.id == mainMenu.actions.first().contentId
        } else {
          false
        }
      }
      if (subPage?.items?.isNotEmpty() != null) {
        MenuItem(mainMenu.type, mainMenu.titles, mainMenu.actions[0].type, subPage.items)
      } else {
        null
      }
    }
  }


  val programs = cards.mapNotNull { card ->
              if (card is Program) {
                epgRepository.getProgramProgress(currentTime = currentTime, program = card)
              } else {
                null
              }
            }

标签: androidkotlinfunctional-programmingkotlin-android-extensions

解决方案


您可以将前面的代码替换为

            return config.mainMenus.mapNotNull { mainMenu ->
        config.subPages
                .find{mainMenu.actions.firstOrNull()?.contentId?.equals(it.id)?:false}
                ?.let{menu->
                    MenuItem(mainMenu.type, mainMenu.titles, mainMenu.actions[0].type, menu.items).takeIf{menu.items?.isNotEmpty()==true}
                }?:null
    }
}

第二个可能是

  val programs = cards.
      filterIsInstance<Program>().
      map { epgRepository.getProgramProgress(currentTime = currentTime, program = card)}

在这种情况下,您首先过滤集合,仅获取程序元素,并且仅将那些元素转换为函数 getProgramProcess 返回的类型


推荐阅读