7

よりエレガントなソリューションを求めて

私はこのコードを持っています。エラー処理を行う必要がないテストケースで使用します。それが何をするか:

  • 文字列の入力リストを取得します
  • DSJStteper.parseDSResultメソッドを使用してそれらを解析します
  • それらをフィルタリングし、それぞれから右の値を抽出します(左は例外です)

コードは次のとおりです。

  def parseDs(ins: List[String]) = {
    def filterResults[U, T](in: List[Either[U, T]]): List[T] = {
      in.filter(y => y.isRight).map(z => z.right.get)
    }
    filterResults(ins.map(x => DSJsonMapper.parseDSResult(x)))
  }

今、私はそれほど多くのポリモーフィック関数を実行していませんが、これは機能します。でも少し醜い気がします。誰かが同じことを達成する方法について、より良い提案を持っていますか?

私はこれが個人的な好みの場合に帰着することを知っています。しかし、提案は大歓迎です。

4

2 に答える 2

11

collectまさにこの種の状況のた​​めに作られています:

def filterMe[U,T](in: List[Either[U,T]]): List[T] = in.collect{
  case Right(r) => r
}

実際、これは非常に優れているので、スキップしてdef

ins.map(DSJsonMapper.parseDsResult).collect{ case Right(r) => r }
于 2012-08-08T16:00:28.753 に答える
7

Rex's answer is possibly a little clearer, but here's a slightly shorter alternative that parses and "filters" in a single step:

ins.flatMap(DSJsonMapper.parseDSResult(_).right.toOption)

Here we take the right projection of each parse result and turn that into an Option (which will be None if the parse failed and Some(whatever) otherwise). Since we're using flatMap, the Nones don't appear in the result and the values are pulled out of the Somes.

于 2012-08-08T16:20:40.850 に答える