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

如何在Java中实例化和填充Scala流?,java,scala,Java,Scala,我有一个Scala函数foo(bs:Stream[Bar]):Bat,我需要从Java代码调用它。如何在Java中创建“bs”流(Stream[Bar]),并惰性地生成其Bar对象?您尝试过吗 scala.collection.immutable.Stream bs = new scala.collection.immutable.Stream() ?最好的方法是使用流上可用的工厂之一。对于其中最有用的功能,您还需要实现Function1,这可以通过扩展AbstractFunction1来实现

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

您尝试过吗

scala.collection.immutable.Stream bs = new scala.collection.immutable.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;
    }
}
导入scala.collection.immutable.Stream;
导入scala.runtime.AbstractFunction1;
公共类{
public Stream=Stream.iterate(0,new Increment());
}
类增量扩展了AbstractFunction1{
公共整数应用(整数v1){
返回v1+1;
}
}

根据流中需要的内容,创建
java.util.Iterator
并通过
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();
导入scala.collection.JavaConverters;
导入scala.collection.immutable.Stream;
...
列表=新的ArrayList();
\\以某种方式填写清单。。。
Iterator it=list.Iterator();
Stream=JavaConverters.AsscalAteratorConverter(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=JavaConverters.asscalateratorconverter(
新迭代器(){
int i=0;
公共布尔hasNext(){return true;}
public void remove(){抛出新的UnsupportedOperationException();}
公共字符串next(){return Integer.toString(i++);}
}
).asScala().toStream();

它不像
Stream.iterate(0)(+1).map(u.toString)
那样漂亮,但它可以工作。

我知道您在寻找scala流,但也有功能性java:

我编辑了这个问题,试图让大家明白,我在寻找一个基于java的流生成的完整示例(不仅仅是实例化)那条小溪从哪里来?您是否在Java集合中拥有它,您是否会通过事件获取它,什么?如果不知道这一点,就不可能断言什么是最好的方法。我很想了解如果某个事件产生了不同的结果,我会做什么/为什么我会做一些不同的事情。对于你的问题,@Travis-answer是一个不错的选择。从事件生成更困难——Scala的sys.process库就是一个很好的例子,它可以从正在运行的进程的
OutputStream
生成
流。我接受@Travis的答案,因为它是我特定问题的最简单答案,但这个答案对于更一般的情况非常有用。