2015-10-19 51 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的解答,我認爲解釋也會有用。)