Ответ 1
Оказывается, я все-таки пропустил сложный импорт:
import collection.JavaConversions._
не путать с JavaConverters._
, который у меня был.
Надеюсь, это поможет кому-то другому.
Я пытаюсь реорганизовать некоторый код 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"))
Любые идеи, которые вызывают ошибку, просто переместив ее в класс?
Я искал ошибку и, похоже, довольно общий.
Оказывается, я все-таки пропустил сложный импорт:
import collection.JavaConversions._
не путать с JavaConverters._
, который у меня был.
Надеюсь, это поможет кому-то другому.
Проблема заключается в том, что вы используете 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-карте