Scala Ошибка Java: фильтр значений не является членом java.util.Map. Работает вне класса

Я пытаюсь реорганизовать некоторый код Scala в Eclipse и запустить эту ошибку компиляции:

фильтр значений не является членом 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);        
    }

(config - это объект с "параметром", являющимся Map of 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);

как вы можете видеть, код точно такой же. Я импортировал те же библиотеки. Все, что я делаю по-другому, - это создать экземпляр ConfigLoader и вызвать его так:

cfgLoader.parseFile(config.param("properties"))

Любые идеи, которые вызывают ошибку, просто переместив ее в класс?

Я искал ошибку и, похоже, довольно общий.

Ответ 1

Оказывается, я все-таки пропустил сложный импорт:

import collection.JavaConversions._

не путать с JavaConverters._, который у меня был.

Надеюсь, это поможет кому-то другому.

Ответ 2

Проблема заключается в том, что вы используете java-карту, которая не реализует монады api (map, flatMap,...), необходимые для использования scala для-понимания.

В частности, в вашем примере компилятор жалуется на отсутствие метода .filter. Это происходит потому, что вы распаковываете каждый элемент карты: (key, value) <- monad вместо прямого назначения, например entry <- monad. Но даже если вы использовали прямое назначение, он будет жаловаться на отсутствие .map или .flatMap. См. этот ответ на вопрос о том, как сделать свой собственный для понимания scala monad для получения подробной информации о требуемом api.

Самое простое решение вашей проблемы - конвертировать вашу java-карту в карту scala, используя:

import scala.collection.JavaConverters._

...
for((k,v) <- conf.asScala) ...

Импорт включает неявные, которые добавляют метод .asScala к java-карте