仅当Scala中的iterable不为null时,如何映射?

时间:2016-04-04 21:05:39

标签: scala nullpointerexception

我正在尝试从Play框架中的配置文件中检索服务器列表。目前我有以下代码:

val servers: List[Server] = {
  val servers = ConfigFactory.load().getConfigList("servers") map { s =>
    Server(s.getString("ip"), s.getString("port")) }
  servers.toList
}

配置文件中不存在"servers"时出现问题。在这种情况下,ConfigFactory.load().getConfigList("servers") == nullmap操作会导致NullPointerException。一个简单的解决方法是存储ConfigFactory.load().getConfigList("servers")的结果,并对其结果进行分支。

这种方法对我来说并不像惯用语。如果前面的表达式不是map

,我是否只能null

3 个答案:

答案 0 :(得分:2)

看起来您正在使用Java API for Play。

play.api.Play.application.configuration.getConfigList

会调用def getConfigList(path: String): Option[List[Configuration]]然后您可以在

上使用getOrElse

server_list = ConfigFactory.load()。getConfigList(“servers”)。getOrElse(List())

请注意,play.api.Play.application已弃用。正如OP所指出的,检索此值的新代码应为server_list = ConfigFactory.load().getConfigList("servers")

答案 1 :(得分:0)

我现在要加上这个。

import com.typesafe.config.ConfigFactory

//...

val server_list = ConfigFactory.load().getConfigList("servers")

val servers: List[Server] = server_list match {
  case null => List[Server]()
  case _ => val servers = server_list map { s =>
    Server(s.getString("ip"), s.getString("port")) }
  servers.toList
}

答案 2 :(得分:0)

也许你可以尝试围绕第一个电话包装一个选项:

val server_list = Option(play.Play.application().configuration().getConfigList("servers"))

这应该返回None而不是null。然后你可以使用.getOrElse(List.empty).map ...