UniRx: Take と First と Single

Take, First, Single の各オペレータは、ストリームに流れる値を取り出します。 オペレータに応じて、それぞれストリームにいくつ値がながれるか、期待する個数が異なります。

  • Take は、ストリームの最初の N 個を取り出します(N は引数で指定)。不足があっても構いません。
  • First は、ストリームの最初の値を取り出します。ストリームには、ひとつ以上の値が流れることを期待します。
  • Single は、ストリームの最初の値を取り出します。ストリームには、ちょうどひとつだけ値が流れることを期待します。

Take のサンプル

f:id:noriok:20181006223447p:plain

void Start()
{
    var s = Observable.Range(1, 3);
    s.Take(2).Debug().Subscribe(); // 2 個取り出す
    s.Take(5).Debug().Subscribe(); // 5 個取り出す
}

実行結果です。

OnSubscribe
OnNext(1)
OnNext(2)
OnCompleted()
OnSubscribe
OnNext(1)
OnNext(2)
OnNext(3)
OnCompleted()

Take() は引数で指定された個数だけ値を取り出しますが、不足分があっても構いません。

First のサンプル

f:id:noriok:20181006223609p:plain

void Start()
{
    var s = Observable.Range(1, 3).First();
    s.Debug().Subscribe();
}

実行結果です。

OnSubscribe
OnNext(1)
OnCompleted()
  • もし、ストリームに値が流れない場合は、「InvalidOperationException: sequence is empty」例外が生成されます。

Single のサンプル

void Start()
{
    var s = Observable.Return(100).Single();
    s.Debug().Subscribe();
}

実行結果です。

OnSubscribe
OnNext(100)
OnCompleted()
  • もし、ストリームに値が流れない場合は、「InvalidOperationException: sequence is empty」例外が生成されます。
  • もし、ストリームにふたつ以上の値が流れる場合は、「InvalidOperationException: sequence is not single」例外が生成されます。

参考