找到Scala Try[String]而不是String
我试图理解Try在scala中是如何工作的(不是Try/catch),而是Try。例如,这里我想检查文件是否存在,如果存在,我将在代码的后面使用文件中的数据,但它不起作用:找到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
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块相比,因为它们只是“抛出”异常,这些异常将在程序中稍后处理。ScalaTry
强制您确保从程序中的该点开始,始终处理可能的错误
您可以这样做:
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()如何?失败呢?