如何在Java中实例化和填充Scala流?

时间:2011-09-23 19:39:16

标签: java scala

我需要从Java代码调用Scala函数foo(bs : Stream[Bar]) : Bat。如何在Java中创建“bs”流(Stream[Bar])并懒惰地生成其Bar对象?

4 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分: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)那样漂亮,但它有效。

答案 2 :(得分:0)

你试过吗

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

答案 3 :(得分:0)

我知道你在寻找scala流,但也有功能java:http://functionaljava.googlecode.com/svn/artifacts/3.0/javadoc/fj/data/Stream.html