Scala尝试[String]找到而不是String

时间:2018-03-09 12:01:20

标签: scala file io functional-programming try-catch

我试图理解Try如何在scala中工作(不是尝试/ catch)但是尝试。例如,在这里我想检查文件是否存在,如果是,我将在稍后的代码中使用文件中的数据,但它不起作用:

val texte = Try(Source.fromFile(chemin_texte).getLines().filter(_!="").foldLeft(""){_+_})
        texte match {
          case Success(x) => x
          case Failure(e) => println("An error occured with the text file"); println("Error: " + e.getMessage)
        }

        /*phrases du texte*/
        val phrases_txt = split_phrases(texte).map(phrase => phrase)

val phrases_txt如果文件存在,我希望使用texte的输出,否则程序应该在Failure(e)暂停。

我得到的错误是类型不匹配;发现:scala.util.Try[String] required: String

有任何帮助吗?感谢。

1 个答案:

答案 0 :(得分:1)

Try视为可能失败的计算的容器。它与try和catch块无法比较,因为它们只是" throw"例外情况,预计将在稍后的程序中处理。 Scala Try强制您确保在程序中始终处理可能的错误。

您可以这样做:

val texte = Try(Source.fromFile(chemin_texte).getLines().filter(_!="").foldLeft(""){_+_})

val phrases: Try[List[String]] = texte.map(split_phrases)

我没有看到.map(phrases => phrases)的重点,因为它会返回相同的对象。 map函数的类型为T[A] => T[B],这意味着对于值为A的容器,map将运行给定的函数f容器的内容上,生成一个B类型的容器,其中函数f负责将A类型的对象转换为B类型}。

如果您希望在程序中进一步使用phrases对象生成Try值的其他值,则可以使用flatMap函数或for表达式生活更轻松。例如:

val morePhrases: Try[List[String]] = ???

def mergePhrases(phrases1: List[String], phrases2: List[String]): Phrases = phrases1 ++ phrases2

val mergedPhrases: Try[List[String]] = for {
  p1 <- phrases
  p2 <- morePhrases
} yield mergePhrases(p1, p2) // Only for demonstration, you could also do yield p1 ++ p2

上面代码中的mergedPhrases值只是一个Try容器,其中包含mergePhrasesphrases内容的morePhrases函数应用结果。

请注意,Try块可能总是是在程序结束时捕获错误的最佳方式,您发现了第一个错误,但是您赢了# 39;不知道错误到底是什么。这就是为什么我们有像Either这样的东西。