Java 可观察的存储最后一个值,但不能推送新值?
假设我有一个Java 可观察的存储最后一个值,但不能推送新值?,java,rx-java,reactive-programming,rx-java3,Java,Rx Java,Reactive Programming,Rx Java3,假设我有一个人界面,它有一个名称可观察: interface Person { Observable<String> name; } class Main { public static void main(String[] args) { Person person = PersonFactory.create(); System.out.println(??person.name.currentValue??); } } 我不想在我的界面中将名称公
人
界面,它有一个名称
可观察:
interface Person {
Observable<String> name;
}
class Main {
public static void main(String[] args) {
Person person = PersonFactory.create();
System.out.println(??person.name.currentValue??);
}
}
我不想在我的界面中将名称公开为BehaviorSubject,因为这样每个人都可以更改名称,这不是我想要的
我有点理解观测值的逻辑,所以我知道它们不是用来存储任何值的。那么,在RxJava中,什么是“具有当前值的不可变可观测值”
在Android中有一个
LiveData
和MutableLiveData
。据我所知,MutableLiveData
相当于BehaviorSubject
,那么在RxJava中,LiveData
的等价物是什么呢?将varaiblename
的类型定义为David
的内部主题,并使用hide()
方法作为可观察对象公开。使用hide将确保外部世界无法调用onNext
,即更改名称
类David实现Person{
private PublishSubject nameSubject=BehaviorSubject.createDefault(“David”);
公共可观测观测值(){
返回nameSubject.hide();
}
//如果你想让外界更新你的名字
公共void集合名(字符串名){
nameSubject.onNext(名称)
}
}
我决定使用字段委托创建自己的LiveData
interface LiveData<out T> {
val observable: Observable<out T>
val value: T
fun subscribe(onNext: Consumer<in T>): Disposable = observable.subscribe(onNext)
}
class MutableLiveData<T>(initial: T) : LiveData<T> {
private val subject: BehaviorSubject<T> = BehaviorSubject.createDefault(initial)
override val observable: Observable<out T> = subject
override var value: T
get() = subject.value
set(value) = subject.onNext(value)
fun mutate(mutationFunction: T.() -> Unit) {
value.mutationFunction()
value = value
}
}
接口LiveData{
可观察的,可观察的
val值:T
乐趣订阅(onNext:Consumer):一次性=可观察。订阅(onNext)
}
类MutableLiveData(初始值:T):LiveData{
private val subject:BehaviorSubject=BehaviorSubject.createDefault(初始)
覆盖val可观察:可观察=受试者
覆盖变量值:T
get()=subject.value
设置(值)=主题.onNext(值)
趣味变异(变异函数:T.()->单位){
value.mutationFunction()
价值=价值
}
}
Hmm,你希望在这里做什么?如何更新可观察的名称发出的值?为什么要将名称返回为一个可观察的
,而不仅仅是一个字符串?我想知道您将在哪里使用它?我通常使用这种模式来创建反应式存储库,例如,当数据发生变化(如用户配置文件或购物车)时,设置数据并通知观察者的地方。此外,似乎有点过于复杂,没有必要传递“变异函数”。
interface LiveData<out T> {
val observable: Observable<out T>
val value: T
fun subscribe(onNext: Consumer<in T>): Disposable = observable.subscribe(onNext)
}
class MutableLiveData<T>(initial: T) : LiveData<T> {
private val subject: BehaviorSubject<T> = BehaviorSubject.createDefault(initial)
override val observable: Observable<out T> = subject
override var value: T
get() = subject.value
set(value) = subject.onNext(value)
fun mutate(mutationFunction: T.() -> Unit) {
value.mutationFunction()
value = value
}
}