2011-09-23 47 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的答案,因为它是我的特定问题的最简单答案,但是这个答案对于更一般的情况非常有用。 –