BlockingObservable { public T lastOrDefault(T defaultValue) { return from(o.takeLast(1)).singleOrDefault(defaultValue); } private  BlockingObservable(Observable<? extends T> o); static BlockingObservable<T> from(final Observable<? extends T> o); void forEach(final Action1<? super T> onNext); Iterator<T> getIterator(); T first(); T first(Func1<? super T, Boolean> predicate); T firstOrDefault(T defaultValue); T firstOrDefault(T defaultValue, Func1<? super T, Boolean> predicate); T last(); T last(final Func1<? super T, Boolean> predicate); T lastOrDefault(T defaultValue); T lastOrDefault(T defaultValue, Func1<? super T, Boolean> predicate); Iterable<T> mostRecent(T initialValue); Iterable<T> next(); Iterable<T> latest(); T single(); T single(Func1<? super T, Boolean> predicate); T singleOrDefault(T defaultValue); T singleOrDefault(T defaultValue, Func1<? super T, Boolean> predicate); Future<T> toFuture(); Iterable<T> toIterable();  }
@Test public void testLastOrDefault() { BlockingObservable<Integer> observable = BlockingObservable.from(Observable.from(1, 0, -1)); int last = observable.lastOrDefault(-100, new Func1<Integer, Boolean>() { @Override public Boolean call(Integer args) { return args >= 0; } }); assertEquals(0, last); }