Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Scala打开对标准输出或文件的写入_Java_Scala_Io_Stdout - Fatal编程技术网

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