Skip to content

Commit ab0d56f

Browse files
authored
Merge pull request #55 from protogenes/feature/sentinel-null
allow a custom null-sentinel value
2 parents 999aebe + 2bd4a10 commit ab0d56f

2 files changed

Lines changed: 35 additions & 0 deletions

File tree

src/main/java/io/reactivex/rxjavafx/observables/JavaFxObservable.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,18 @@ public static <T> Observable<T> valuesOf(final ObservableValue<T> fxObservable)
6565
return ObservableValueSource.fromObservableValue(fxObservable);
6666
}
6767

68+
/**
69+
* Create an rx Observable from a JavaFX ObservableValue
70+
*
71+
* @param fxObservable the observed ObservableValue
72+
* @param nullSentinel the default sentinel value emitted when the observable is null
73+
* @param <T> the type of the observed value
74+
* @return an Observable emitting values as the wrapped ObservableValue changes, null will be replaces with nullSentinel
75+
*/
76+
public static <T> Observable<T> valuesOf(final ObservableValue<T> fxObservable, final T nullSentinel) {
77+
return ObservableValueSource.fromObservableValue(fxObservable, nullSentinel);
78+
}
79+
6880
/**
6981
* Create an rx Observable from a JavaFX ObservableValue
7082
*

src/main/java/io/reactivex/rxjavafx/sources/ObservableValueSource.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,29 @@ public static <T> Observable<T> fromObservableValue(final ObservableValue<T> fxO
4242
});
4343
}
4444

45+
public static <T> Observable<T> fromObservableValue(final ObservableValue<T> fxObservable, final T nullSentinel) {
46+
if (nullSentinel == null) {
47+
throw new NullPointerException("The null value sentinel must not be null.");
48+
}
49+
return Observable.create((ObservableEmitter<T> emitter) -> {
50+
if (fxObservable.getValue() != null) {
51+
emitter.onNext(fxObservable.getValue());
52+
}
53+
54+
final ChangeListener<T> listener = (observableValue, prev, current) -> {
55+
if (current != null) {
56+
emitter.onNext(current);
57+
} else {
58+
emitter.onNext(nullSentinel);
59+
}
60+
};
61+
62+
fxObservable.addListener(listener);
63+
64+
emitter.setDisposable(JavaFxSubscriptions.unsubscribeInEventDispatchThread(() -> fxObservable.removeListener(listener)));
65+
});
66+
}
67+
4568
public static <T> Observable<Optional<T>> fromNullableObservableValue(final ObservableValue<T> fxObservable) {
4669
return Observable.create((ObservableEmitter<Optional<T>> emitter) -> {
4770
emitter.onNext(Optional.ofNullable(fxObservable.getValue()));

0 commit comments

Comments
 (0)