2015-10-19 78 views
1

我在我的程序如下Scala代码:斯卡拉遍历Java函数

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] 

任何想法,我哪里出错了?

回答

6

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

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

顺便说一句:你可以通过java Array/Map循环,因为scala隐式地创建一个迭代器。

1

for -loop遍历一个对象。您想要遍历由parser返回的Word。但是你的代码实际上需要第一个Word并试图迭代它。 (另外一个问题是,next而你的变量是Word类型的返回Object。)

Scala中编译一个for -loop成一系列方法调用。 spec表示它将转化为mapwithFilter,flatMapforeach。要迭代的对象必须具有(至少部分)这些用于for -loop的方法才能工作。看起来像是由于某种原因,它实际上试图拨打返回parser.next()

(见Zeng的解答,我认为解释也会有用。)