找到Scala Try[String]而不是String

找到Scala Try[String]而不是String,scala,file,io,functional-programming,try-catch,Scala,File,Io,Functional Programming,Try Catch,我试图理解Try在scala中是如何工作的(不是Try/catch),而是Try。例如,这里我想检查文件是否存在,如果存在,我将在代码的后面使用文件中的数据,但它不起作用: val texte = Try(Source.fromFile(chemin_texte).getLines().filter(_!="").foldLeft(""){_+_}) texte match { case Success(x) => x case Fa

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

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\u txt
我希望使用
texte的输出,如果文件存在,如果没有,程序应该在
故障(e)
时停止

我得到的错误是类型不匹配;找到:
scala.util。请尝试[String]所需:String


有什么帮助吗?谢谢。

请将
Try
视为可能失败的计算的容器。它不能与try-and-catch块相比,因为它们只是“抛出”异常,这些异常将在程序中稍后处理。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

如果您希望在程序中进一步将
短语
对象与生成
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
val moresphrases:Try[List[String]=???
def mergePhrases(短语1:List[String],短语2:List[String]):短语=短语1++短语2
val mergedPhrases:Try[List[String]]=for{

p1您需要将匹配结果分配给一个变量。
texte
是一个
Try[String]
。如果匹配成功,则匹配结果是要传递给
split\u短语的
String
。是的,我明白您的意思,但如果我执行
val temp=texte match…
则我不能调用split\u短语(temp)因为它说它返回Any而不是String-我同意这样一个事实,即如果成功,它是一个String,但我们不考虑失败哦,这是真的……您可能想
map
尝试
Try
texte.map(x=>split\u短语(x).),然后检查最后的成功,而不是在中间。在这种情况下,我最好的建议是向代码中的每个VAR/VAL添加显式类型。如果使用IDE,则更容易。您将看到一些VAL并不是您正在考虑的类型。非常感谢您的回答。但是XXX匹配{CaseExcel()如何?失败呢?