Scala循环遍历java函数

时间:2015-10-19 07:33:01

标签: scala

我的程序中有以下Scala代码:

val parser = new PlainToTokenParser(...)
for {
  word: Word <- parser.next()
  if word == null
} {
  print(word)
}

其中PlainToTokenParser是另一个库中的java类:

public class PlainToTokenParser implements Parser {

    public PlainToTokenParser(Parser p) {
        this.parser = p;
    }

    public Object next() {
       // some work here and return an output
    }
}

编译我的scala代码时出现以下错误:

... value filter is not a member of Object
[error]     for{ word: Word <- parser.next()
[error]  

知道我哪里错了吗?

2 个答案:

答案 0 :(得分:6)

因为PlainToTokenParser不是scala迭代器,所以必须创建一个scala迭代器来使用for循环。

val parser = new PlainToTokenParser(...)
for {
  word <- Iterator.continually(parser.next).takeWhile(_ != null) // Assume null is the end
} {
  print(word)
}

BTW:你可以遍历java Array / Map,因为scala隐式创建了一个迭代器。

答案 1 :(得分:1)

for - 循环迭代一个对象。您想迭代Word返回的parser。但是你的代码实际上需要第一个Word并尝试迭代它。 (另一个问题是next返回Object,而您的变量属于Word类型。)

Scala将for - 循环编译为一系列方法调用。 spec表示它会转换为mapwithFilterflatMapforeach。要迭代的对象必须(至少部分)这些方法才能使for循环起作用。由于某些原因,它实际上试图在filter返回的Object上致电parser.next()

(见Zeng的解决方案答案。我认为解释也很有用。)