2016-04-04 23 views
-1

Oynatım çerçevesindeki bir yapılandırma dosyasından sunucuların listesini almaya çalışıyorum. Şu anda aşağıdaki kodu vardır:Yalnızca yinelenen Scala'da null olmadığında nasıl eşlenir?

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

"servers" yapılandırma dosyasındaki var olmayan biriyle bir problem ortaya çıkar. Bu durumda, ConfigFactory.load().getConfigList("servers") == null, dolayısıyla map işlemi bir NullPointerException neden olur. Kolay bir çözüm, ConfigFactory.load().getConfigList("servers") sonucunu saklamak ve sonucuna dalmak olabilir.

Bu yaklaşım bana aptalca gelmiyor. Önceki ifade null değilse, yalnızca map kullanmanın bir yolu var mı?

cevap

2

Java API for Play kullanıyorsunuz.

play.api.Play.application.configuration.getConfigList 

def getConfigList(path: String): Option[List[Configuration]] çağırabilir misiniz hangi sonra

server_list = ConfigFactory.load(). GetConfigList ("sunucuları") üzerine getOrElse kullanabilirsiniz. GetOrElse (Liste())

Not play.api.Play.application olduğunu kullanımdan kaldırıldı. almak için OP yeni kodu belirttiği gibi bu değer

+0

Sadece "com.typesafe.config.ConfigFactory" bulundu, sonuçta ortaya çıkan değişiklik "val server_list = ConfigFactory.load(). GetConfigList" olmalıdır. sunucuları ")'. Bunu soruğumda güncelleyeceğim ve ardından bu yorumu kaldıracağım. – erip

+0

Cool, ayrıca 'Seçenek [Liste [T]]' ni düzeltebildiğini fark ettiniz, ancak 'getOrElse (List())' i kullanarak 'List [T]' ile bitebilirsiniz. –

0

Bunu şimdilik ekleyeceğim.

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 
} 
0

server_list = ConfigFactory.load().getConfigList("servers") Belki ilk çağrıdan etrafında Birini sarma deneyebilirsiniz olmalıdır:

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

Bu boş yerine Hiçbiri dönmelidir. Sonra .getOrElse (List.empty) .map ... kullanabilirsiniz.

İlgili konular