Эквивалент Iterator.continually для Iterable? - PullRequest
0 голосов
/ 29 октября 2019

Мне нужно произвести java.lang.Iterable[T], где подача T - это какая-то длительная операция. Кроме того, после того, как T предоставлено, оно оборачивается и производятся дальнейшие вычисления для подготовки к следующей итерации.

Сначала я думал, что смогу сделать это с Iterator.continually. Тем не менее, вызов toIterable для результата на самом деле создает Stream[T] - проблема в том, что голова жадно оценивается, чего я не хочу.

Как я могу либо:

  1. Создание Iterable[T] из функции снабжения или
  2. Преобразование Iterator[T] в Iterable[T] без использования Stream?

Ответы [ 2 ]

2 голосов
/ 29 октября 2019

В Scala 2.13 вы можете использовать LazyList:

LazyList.continually(1)

В отличие от Stream, LazyList также ленив в голове.

1 голос
/ 29 октября 2019

Поскольку java.lang.Iterable является очень простым API, переходить от scala.collection.Iterator к нему тривиально.

case class IterableFromIterator[T](override val iterator:java.util.Iterator[T]) extends java.lang.Iterable[T]
val iterable:java.lang.Iterable[T] = IterableFromIterator(Iterator.continually(...).asJava)

Обратите внимание, что это противоречит ожиданию того, что iterable.iterator() производит новый Iterator каждыйвремя;вместо этого iterable.iterator() можно вызвать только один раз.

...