这个Scala代码片段可以更简洁吗?

时间:2016-01-21 07:07:25

标签: scala

我在某个地方看到过这个Scala代码段:

def toSentiment(sentiment: Int): Sentiment = sentiment match {
    case x if x == 0 || x == 1 => Sentiment.NEGATIVE
    case 2 => Sentiment.NEUTRAL
    case x if x == 3 || x == 4 => Sentiment.POSITIVE
}

有没有办法更简洁地重写case语句?我怀疑必须有一种更简单(更短)的方式来表达x if x == 0 || x == 1条件。

顺便说一下,这个形式:

def toSentiment(sentiment: Int): Sentiment = sentiment match {
    case 0 => Sentiment.NEGATIVE
    case 1 => Sentiment.NEGATIVE
    case 2 => Sentiment.NEUTRAL
    case 3 => Sentiment.POSITIVE
    case 4 => Sentiment.POSITIVE
}

不是我想要的。我希望有这样的事情:

def toSentiment(sentiment: Int): Sentiment = sentiment match {
    case x in {0, 1} => Sentiment.NEGATIVE
    case 2 => Sentiment.NEUTRAL
    case x in {3, 4} => Sentiment.POSITIVE
}

甚至:

def toSentiment(sentiment: Int): Sentiment = sentiment match {
    case 0, 1 => Sentiment.NEGATIVE
    case 2    => Sentiment.NEUTRAL
    case 3, 4 => Sentiment.POSITIVE
}

2 个答案:

答案 0 :(得分:6)

这个怎么样:

def toSentiment(sentiment: Int): Sentiment = sentiment match {
    case 0 | 1 ⇒ Sentiment.NEGATIVE
    case 2     ⇒ Sentiment.NEUTRAL
    case 3 | 4 ⇒ Sentiment.POSITIVE
}

请注意,此匹配并非详尽无遗。如果运行,可能会出现运行时错误,例如:toSentiment(5)。一些短裤会警告你这件事。更安全的版本(假设其他任何数字都是中性的)可以是:

def toSentiment(sentiment: Int): Sentiment = sentiment match {
    case 0 | 1 ⇒ Sentiment.NEGATIVE
    case 3 | 4 ⇒ Sentiment.POSITIVE
    case _     ⇒ Sentiment.NEUTRAL   
}

答案 1 :(得分:2)

您可以执行以下操作:

def toSentiment(sentiment:Int): Sentiment = {
  import Sentiment._
  Vector(NEGATIVE,NEGATIVE,NEUTRAL,POSITIVE,POSITIVE)(sentiment)
}

占用较少的角色,但我认为不是更好。

我会:检查可以创建此函数的sentiment的范围,以及原始的范围,例如,如果它是6则抛出异常。

使用import Sentiment._可以为您节省一些详细信息。