У меня есть функция Scala foo(bs : Stream[Bar]) : Bat
, которую мне нужно вызвать из Java-кода. Как создать поток "bs" (Stream[Bar]
) в Java и лениво сгенерировать его объекты Bar?
Как создавать и заполнять поток Scala в Java?
Ответ 1
В зависимости от того, что должно быть в потоке, было бы проще создать 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
Лучший способ - использовать одну из фабрик, доступных на компаньоне 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;
}
}
Ответ 3
Вы пробовали
scala.collection.immutable.Stream bs = new scala.collection.immutable.Stream()
?
Ответ 4
Я знаю, что вы искали поток scala, но есть функциональная java: http://functionaljava.googlecode.com/svn/artifacts/3.0/javadoc/fj/data/Stream.html