在Scala中使用List [Char] .head

时间:2016-10-09 13:43:00

标签: scala

Scala新手。如果列表的第一个字符匹配,请尝试检查函数。

def checkFistChar(chars: List[Char]): Boolean =
  if (chars.head == "3") true
  else false

在条件行中我得到Comparing unrelated types

checkFistChar("3 is larger than 2".toList)返回false

2 个答案:

答案 0 :(得分:4)

"3"String,因为您使用的是双引号,而不是Char。您需要使用单引号。此外,您不需要if / else:

def checkFirstChar(chars : List[Char]) = chars.head == '3'

你的函数的另一个问题是在空列表上调用head会抛出异常。一般情况下,您应该只使用headOption来返回Option

//empty list returns false
def safeCheckFirstChar(chars : List[Char]) : Boolean = 
  chars
    .headOption
    .map(_ == '3')
    .getOrElse(false)

这相当于Tzach& amp;&克里斯'评论中的建议以及模式匹配:

def safeCheckFirstChar2(chars : List[Char]) = 
  chars
    .headOption
    .exists(_ == '3')

def safeCheckFirstChar3(chars : List[Char]) =
  chars.headOption == Some('3')

def safeCheckFirstChar4(chars : List[Char]) = chars.headOption match {
  case Some('3') => true
  case _ => false
}

答案 1 :(得分:3)

您可以直接在chars列表上进行模式匹配:

def checkFistChar(chars: List[Char]): Boolean =
  chars match {
    case '3' :: _ => true
    case _ => false
  }

您可以进一步概括checkFistChar

def checkFistChar(ch: Char, chars: List[Char]): Boolean =
  chars match {
    case `ch` :: _ => true
    case _ => false
  }

此实施将检查提供的chchars的负责人。

checkFistChar('3', Nil) should be(false)
checkFistChar('3', List('3')) should be(true)
checkFistChar('3', List('4')) should be(false)
checkFistChar('3', List('3', '4')) should be(true)