Scala Java Error:值过滤器不是java.util.Map的成员.在课外工作

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._我所拥有的相混淆.

希望这有助于其他人.

  • 这在Scala 2.12中被折旧,使用JavaConvertes和.asScala http://stackoverflow.com/a/38320909/429476 (5认同)

Juh*_*uh_ 5

问题是您使用的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映射的隐式