2011-09-23 48 views
13

我有一個需要從Java代碼調用的Scala函數foo(bs : Stream[Bar]) : Bat。如何在Java中創建「bs」流(Stream[Bar])並延遲生成其Bar對象?如何在Java中實例化和填充Scala流?

+0

這個流從哪裏來?你在Java Collection中擁有它,你會通過事件得到它,什麼?如果不知道這一點,就不可能斷言什麼是最好的方式。 –

+0

在我現實世界的問題中,我有一個Java向量。如果是事件產生,我會對理解什麼/爲什麼會做不同的事情感興趣。 –

+0

對於你的問題@Travis的答案是要走的路。從一個事件生成更加困難 - 一個很好的例子就是Scala的sys.process庫,它可以從正在運行的進程的OutputStream生成一個Stream。 –

回答

8

根據什麼需要是在流,這可能是最簡單的創建一個java.util.Iterator,然後將其轉換爲一個Stream通過scala.collection.Iterator

import scala.collection.JavaConverters; 
import scala.collection.immutable.Stream; 

... 

List<String> list = new ArrayList<String>(); 

\\ Fill the list somehow... 

Iterator<String> it = list.iterator(); 

Stream<String> stream = JavaConverters.asScalaIteratorConverter(it) 
             .asScala().toStream(); 

迭代器當然不一定來自集合 - 我們可以通過實現我們自己的迭代器來輕鬆創建無限流:

Stream<String> stream = JavaConverters.asScalaIteratorConverter(
    new Iterator<String>() { 
    int i = 0; 
    public boolean hasNext() { return true; } 
    public void remove() { throw new UnsupportedOperationException(); } 
    public String next() { return Integer.toString(i++); } 
    } 
).asScala().toStream(); 

它不像Stream.iterate(0)(_ + 1).map(_.toString)那樣漂亮,但它的工作原理。

+0

非常容易使用。謝謝! –

0

你試過

scala.collection.immutable.Stream bs = new scala.collection.immutable.Stream() 

+0

我已經編輯了這個問題,試圖說清楚我正在尋找一個基於Java的Stream生成的完整示例(不僅僅是實例化) –

10

最好的方法是使用Stream對象伴侶提供的工廠之一。對於他們中最有用的,你也需要實現Function1,這可以通過擴展AbstractFunction1來完成。

下面是一個例子:

import scala.collection.immutable.Stream; 
import scala.runtime.AbstractFunction1; 

public class Ex { 
    public Stream<Integer> stream = Stream.iterate(0, new Increment()); 
} 

class Increment extends AbstractFunction1<Integer, Integer> { 
    public Integer apply(Integer v1) { 
     return v1 + 1; 
    } 
} 
+0

我接受了@Travis的答案,因爲它是我的特定問題的最簡單答案,但是這個答案對於更一般的情況非常有用。 –