Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可观察的存储最后一个值,但不能推送新值?_Java_Rx Java_Reactive Programming_Rx Java3 - Fatal编程技术网

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
的等价物是什么呢?

将varaible
name
的类型定义为
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
    }
}