8

if-else機能的なスタイルでは、すべてのブロックがパターン マッチングに置き換えられていることを知っています。Mapしかし、Scala でパターン マッチングを使用して s を処理するにはどうすればよいでしょうか? たとえば、このコードをより機能的なスタイルに書き直すにはどうすればよいですか?

  val myMap= getMap()
  if(myMap.contains(x) && myMap.contains(y)) Some(myMap(x) + myMap(y))
    else if(myMap.contains(x + y)){
      val z = myMap(x + y)
      if (z % 2 == 0) Some(z)
      else None
    }
    else None
4

4 に答える 4

22

Scala では単なる式であるif-elseため、関数型プログラミングでは使用は完全に許容されます。if-elseとパターン マッチングのどちらを使用するかを決定する理由はif-else、主に読みやすさの向上に重点を置く必要があります。

これがあなたのコードを書き直す私の試みです。ここでは実際にはパターン マッチングを使用していませんがfor、値を合計するために内包表記を使用しています。

def sumOfValues = for{
  mx <- myMap.get(x)
  my <- myMap.get(y)
} yield mx + my

def valueOfSumIfEven = myMap.get(x+y).filter(_ % 2 == 0) 

sumOfValues orElse valueOfSumIfEven
于 2013-08-19T10:26:28.773 に答える
3

どうですか:

myMap.get(x)
    .zip(myMap.get(y))
    .headOption.map(x => x._1 + x._2)
    .orElse(myMap.get(x + y)
    .filter(__ % 2 == 0))
于 2013-08-19T12:31:13.147 に答える