21

私はこのように変数を初期化します:-

 val user: BehaviorSubject<User?> user = BehaviorSubject.create()

しかし、私はこれを行うことはできません。IDE がエラーをスローします:-

user.onNext(null)

そして、これを行うと、IDEはuが決してnullにならないと言います:-

user.filter( u -> u!=null)
4

7 に答える 7

0

RxJava 2 はnull値をサポートしていないため、使用できるその他の受け入れ可能なソリューションがいくつかあります。

  • 投稿された回答のいくつかが示唆するように、オプションのカスタムまたはサードパーティのラッパーライブラリを使用してください。Kotlin を支持して Java を取り除いたとき、Kotlin 自体がその型 System の一部として nullability をサポートしているため、Optionals は同じパッケージでなくなりました。この変更だけで、コードはより明確になりました。個人的には、回避できる限り、オプションをコードに戻したくありません。
  • サブジェクトAnyタイプでクラス インスタンスを発行します。たとえば、 nullEmpty.INSTANCE値をエミュレートし、enum クラスでフィルタリングする enum クラスを作成できます。
  • 最後の 1 つは、私が使用しているもので、前のソリューションの変形であり、特殊化に基づいています。JetBrains の友人たちは、Kotlin ではクラスが非常に安価であることを常に強調しているため、これは、ログに記録されたユーザーとログに記録されていないユーザーを区別するための簡単な例です。

    abstract class SessionUser
    sealed class LoggedUser(val username: String, val password: String) : SessionUser()
    sealed class LogoutUser : SessionUser()
    
    private val user = BehaviorSubject.create<SessionUser>()
    private val loggedUser = 
       user.filter { it is LoggedUser }.cast(LoggedUser::class.java)
    
    fun login(username: String, password: String) {
       user.onNext(LoggedUser(username, password))
    }
    
    fun logout() {
       user.onNext(LogoutUser())
    }
    
于 2018-05-25T19:23:23.513 に答える