2016-07-05 3 views
1

私はScalaから始め、ストリームを使ってパイプラインのswitchIfEmptyがあるかどうかを知りたいと思います。私はRxJavaScalaで空の場合はスイッチ

@Test 
public void testSwitc() { 
    Observable.just(new ArrayList<>()) 
       .switchIfEmpty(Observable.just(Arrays.asList(1)) 
       .subscribe(System.out::println); 

} 

としていたそして、これは私が、私は場合、フィルタは何もリターンを放出しないことをことをしたい

 def distinctList(prevResult: List[Char], currentItem: List[Char]): List[Char] = { 
      currentItem.toStream 
      .filter(currentChar => !prevResult.contains(currentChar)) 
      .map(c=> prevResult++currentItem) 
      .switchIfEmpty(prevResult)--> how can I return a default value 

}

を試みたいものが何であるかをここで

デフォルト値。

+1

あなたが希望の動作を説明してもらえますか? –

+0

私の質問が更新されました。十分に明確であれば教えてください – paul

+1

'(prevResult ++ currentItem).distinct'についてどうですか? –

答えて

1

むしろObservable.justを使用するよりも、あなたはOptionはあなたの既定値にとるgetOrElse経由で計算するか、デフォルト値の値を取得することができます生得的機能を持っている、言語に内蔵​​されたスカラ座でOption[A+]を使用することができたはずOptionの現在のタイプと同じタイプ

ちなみに、関数はStream[List[Char]]を返します。戻り値を取得するには、修正する必要があります。

+0

currentItem.toStreamとOptionを使うのはどういう違いがありますか?例を挙げてください – paul

+0

OptionはコンテナStreamは、シーケンスを作成することを可能にするデータ構造コンテナの形式ですが、リストとストリームの違いは、ストリームが遅延評価されているか、数学で「非厳密」であることです。したがって、それを呼び出すことによって計算されるように求めるまで、計算されずに残されます。 –

2

あなたは、ストリームのご入力リストを折るし、その後、以下に示すように折り畳まれた結果に対してパターンマッチングを実行するためにfoldLeftを使用することができます。

def distinctList(prevResult: List[Char], currentItem: List[Char]): List[Char] = { 
    currentItem.toStream 
    .foldLeft(prevResult){ case (result, currentChar) => 
     prevResult ++ result.filter(r => !result.contains(currentChar)) 
    } match { 
     case Nil => "how can I return a default value".toList 
     case x => x 
    } 
} 
+0

それは、すべてのコードは、将来のバージョンでswitchIfEmpty(defaultValue)演算子でそれを持つことは素晴らしいだろう:) – paul

関連する問題