dli*_*922 17 java functional-programming scala list-comprehension map
我正在尝试在Eclipse中重构一些Scala代码并遇到此编译错误:
value filter不是java.util.Map的成员
import java.io.File
import com.typesafe.config._
class ConfigLoader {
def parseFile( confFile : File) {
val conf = ConfigFactory.parseFile(confFile).root().unwrapped();
for((k,v) <- conf; (dk, dv) = (k, v.toString())) config.param += (dk -> dv);
}
Run Code Online (Sandbox Code Playgroud)
(config是一个对象,"param"是String的字符串:String)
这段代码是完全从Main()拉出来的,它的工作正常如下:
object Main extends Logging {
def main(args: Array[String]) {
//code cropped for readability.
//config.param["properties"] is absolute path to a passed-in properties file.
val conf = ConfigFactory.parseFile(new java.io.File(config.param("properties"))).root().unwrapped();
for((k,v) <- conf; (dk, dv) = (k, v.toString())) config.param+=(dk -> dv);
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,代码完全相同.我导入了相同的库.现在我在main中做的不同就是实例化ConfigLoader并调用它:
cfgLoader.parseFile(config.param("properties"))
任何想法只是通过将它移动到一个类导致错误?
我用谷歌搜索了这个错误,它看起来很通用.
dli*_*922 48
事实证明我毕竟错过了一个棘手的导入:
import collection.JavaConversions._
不要与JavaConverters._我所拥有的相混淆.
希望这有助于其他人.
问题是您使用的Java Map没有实现使用scala理解所需的monad api(map,flatMap等)。
更具体地说,在您的示例中,编译器抱怨缺少.filter方法。这是因为您打开地图的每个项目的包装:(key, value) <- monad而不是直接分配,例如entry <- monad。但是,即使您确实使用了直接分配,它也会抱怨缺少.map或.flatMap。有关所需api的详细信息,请参见“如何使自己拥有与理解兼容的scala monad”的答案。
解决问题的最简单方法是使用以下命令将Java映射转换为Scala映射:
import scala.collection.JavaConverters._
...
for((k,v) <- conf.asScala) ...
Run Code Online (Sandbox Code Playgroud)
导入包括将.asScala方法添加到Java映射的隐式