BlockingObservable { public T last() { return blockForSingle(o.last()); } 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 testLast() { BlockingObservable<String> obs = BlockingObservable.from(Observable.just("one", "two", "three")); assertEquals("three", obs.last()); }
@Test public void testUnsubscribeFromLastWhenInterrupted() throws InterruptedException { new InterruptionTests().assertUnsubscribeIsInvoked("last()", new Action1<BlockingObservable<Void>>() { @Override public void call(final BlockingObservable<Void> o) { o.last(); } }); }