Подтвердить что ты не робот

Как создавать и заполнять поток Scala в Java?

У меня есть функция Scala foo(bs : Stream[Bar]) : Bat, которую мне нужно вызвать из Java-кода. Как создать поток "bs" (Stream[Bar]) в Java и лениво сгенерировать его объекты Bar?

4b9b3361

Ответ 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()

?