Как создать и заполнить Scala Stream на Java? - PullRequest
13 голосов
/ 23 сентября 2011

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

Ответы [ 4 ]

10 голосов
/ 24 сентября 2011

Лучший способ - использовать одну из фабрик, доступных для 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;
    }
}
8 голосов
/ 24 сентября 2011

В зависимости от того, что должно быть в потоке, может быть проще создать 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 голосов
/ 24 сентября 2011

Я знаю, что вы искали поток Scala, но также есть функциональная Java: http://functionaljava.googlecode.com/svn/artifacts/3.0/javadoc/fj/data/Stream.html

0 голосов
/ 24 сентября 2011

Вы пробовали

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

?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...