diff --git a/akka-stream-tests/src/test/java/akka/stream/javadsl/SourceTest.java b/akka-stream-tests/src/test/java/akka/stream/javadsl/SourceTest.java index ad200ba1f1..473b725c07 100644 --- a/akka-stream-tests/src/test/java/akka/stream/javadsl/SourceTest.java +++ b/akka-stream-tests/src/test/java/akka/stream/javadsl/SourceTest.java @@ -463,6 +463,16 @@ public class SourceTest extends StreamTest { assertEquals("A", result); } + @Test + public void mustWorkFromRange() throws Exception { + Future> f = Source.range(0, 10).grouped(20).runWith(Sink.> head(), materializer); + final List result = Await.result(f, FiniteDuration.create(3, TimeUnit.SECONDS)); + assertEquals(result.size(), 11); + Integer counter = 0; + for (Integer i: result) + assertEquals(i, counter++); + } + @Test public void mustRepeat() throws Exception { final Future> f = Source.repeat(42).grouped(10000).runWith(Sink.> head(), materializer); diff --git a/akka-stream/src/main/scala/akka/stream/javadsl/Source.scala b/akka-stream/src/main/scala/akka/stream/javadsl/Source.scala index 99afbd8014..355947e351 100644 --- a/akka-stream/src/main/scala/akka/stream/javadsl/Source.scala +++ b/akka-stream/src/main/scala/akka/stream/javadsl/Source.scala @@ -4,6 +4,7 @@ package akka.stream.javadsl import java.io.{ OutputStream, InputStream, File } +import java.util import akka.actor.{ ActorRef, Cancellable, Props } import akka.event.LoggingAdapter @@ -110,6 +111,18 @@ object Source { new Source(scaladsl.Source(scalaIterable)) } + /** + * Creates [[Source]] with `start` as the first element and each next element as `previous + 1` until + * it reaches `end`. It allows to create `Source` out of range as simply as on scala `Source(1 to N)` + */ + def range(start: Int, end: Int): javadsl.Source[Integer, Unit] = { + require(start <= end, "start must be less or equal than end") + from(new util.AbstractList[Integer]() { + override def get(index: Int) = start + index + override def size() = end - start + 1 + }) + } + /** * Start a new `Source` from the given `Future`. The stream will consist of * one element when the `Future` is completed with a successful value, which