Java Scala打开对标准输出或文件的写入
假设我有一个函数Java Scala打开对标准输出或文件的写入,java,scala,io,stdout,Java,Scala,Io,Stdout,假设我有一个函数 writeToFileOrStdout(fname: String = Nil) = { ... } 如果用户为fname传递一个字符串值,那么我想打开一个具有该名称的文件并写入该文件;否则,我想打印到标准输出。我总是可以写一个if语句来处理这个问题,但是我如何在fname上写一个case语句并打开正确的对应outputStream呢 val outStream = fname match { case Nil => ??? case _
writeToFileOrStdout(fname: String = Nil) = { ... }
如果用户为fname传递一个字符串值,那么我想打开一个具有该名称的文件并写入该文件;否则,我想打印到标准输出。我总是可以写一个if语句来处理这个问题,但是我如何在fname上写一个case语句并打开正确的对应outputStream呢
val outStream = fname match {
case Nil => ???
case _ => new java.io.FileOutputStream(new java.io.File(fname))
}
outStream.write( ... )
谢谢 为什么不将函数重写为:
def writeToFileOrStdout(fname: Option[String] = None) = {
val outStream = fname match{
case Some(name) => new java.io.FileOutputStream(new java.io.File(name))
case None => System.out
}
...
}
使用选项
作为可选输入总是一个好主意,而不是使用null
。这就是它的基本用途。在好的scala代码中,您不会看到对null
的显式引用
事实上,你的代码甚至没有为我编译
Nil
用于表示空列表,而不是null或未提供的字符串
以增强cmbaxter的响应
将带有可能的null
值的String
映射到选项[String]
非常简单:选项(stringValue)
将返回None
,其中stringValue
为null
,而Some(stringValue)
为非null
因此,您可以:
写入文件或输出(选项(stringValue))
,或String
(可能还有一个null
值)作为writeToFileOrStdout
的参数,则在内部使用选项(fname)
,并匹配它返回的内容:
def writeToFileOrStdout(fname: String = null) = {
val outStream = Option(fname) match{
case Some(name) => new java.io.FileOutputStream(new java.io.File(name))
case None => System.out
}
...
}
<>为了进一步增强CMBxter的反应,你可以考虑写这个:
def filenameToOutputStream(name: String) =
new java.io.FileOutputStream(new java.io.File(name))
def writeToFileOrStdout(fname: Option[String] = None) = {
val outStream = fname map filenameToOutputStream getOrElse System.out
...
}
正如帖子所暗示的,这可能是更为惯用的Scala