Skip to content

Commit 3923786

Browse files
committed
Add orElse to RxScala
1 parent 6f85e54 commit 3923786

File tree

3 files changed

+33
-0
lines changed

3 files changed

+33
-0
lines changed

language-adaptors/rxjava-scala/src/main/scala/rx/lang/scala/Observable.scala

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2975,6 +2975,26 @@ trait Observable[+T]
29752975
}
29762976
}
29772977

2978+
/**
2979+
* Returns an Observable that emits the items emitted by the source Observable or a specified default item
2980+
* if the source Observable is empty.
2981+
*
2982+
* <img width="640" height="305" src="https://raw.github.com/wiki/Netflix/RxJava/images/rx-operators/defaultIfEmpty.png">
2983+
*
2984+
* @param default the item to emit if the source Observable emits no items. This is a by-name parameter, so it is
2985+
* only evaluated if the source Observable doesn't emit anything.
2986+
* @return an Observable that emits either the specified default item if the source Observable emits no
2987+
* items, or the items emitted by the source Observable
2988+
*/
2989+
def orElse[U >: T](default: => U): Observable[U] = {
2990+
val jObservableOption = map(Some(_)).asJavaObservable.asInstanceOf[rx.Observable[Option[T]]]
2991+
val o = toScalaObservable[Option[T]](jObservableOption.defaultIfEmpty(None))
2992+
o map {
2993+
case Some(element) => element
2994+
case None => default
2995+
}
2996+
}
2997+
29782998
/**
29792999
* Returns an Observable that forwards all sequentially distinct items emitted from the source Observable.
29803000
*

language-adaptors/rxjava-scala/src/test/scala/rx/lang/scala/CompletenessTest.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ class CompletenessTest extends JUnitSuite {
7979
"contains(Any)" -> "contains(U)",
8080
"count()" -> "length",
8181
"debounce(Func1[_ >: T, _ <: Observable[U]])" -> "debounce(T => Observable[Any])",
82+
"defaultIfEmpty(T)" -> "orElse(=> U)",
8283
"delay(Func0[_ <: Observable[U]], Func1[_ >: T, _ <: Observable[V]])" -> "delay(() => Observable[Any], T => Observable[Any])",
8384
"delay(Func1[_ >: T, _ <: Observable[U]])" -> "delay(T => Observable[Any])",
8485
"dematerialize()" -> "dematerialize(<:<[Observable[T], Observable[Notification[U]]])",

language-adaptors/rxjava-scala/src/test/scala/rx/lang/scala/ObservableTest.scala

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,4 +216,16 @@ class ObservableTests extends JUnitSuite {
216216
o.subscribe()
217217
assertFalse(called)
218218
}
219+
220+
@Test
221+
def testOrElse() {
222+
val o = Observable.items(1, 2, 3).orElse(4)
223+
assertEquals(List(1, 2, 3), o.toBlocking.toList)
224+
}
225+
226+
@Test
227+
def testOrElseWithEmpty() {
228+
val o = Observable.empty.orElse(-1)
229+
assertEquals(List(-1), o.toBlocking.toList)
230+
}
219231
}

0 commit comments

Comments
 (0)