Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.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
String 如何在Scala中用默认字符串简洁地替换空字符串(或null)_String_Scala - Fatal编程技术网

String 如何在Scala中用默认字符串简洁地替换空字符串(或null)

String 如何在Scala中用默认字符串简洁地替换空字符串(或null),string,scala,String,Scala,我有一个返回字符串的方法。如果它返回空字符串或null,我想用默认值替换它,例如“”。假设它的名称是getSomeString,这是一个昂贵的操作,因此我只能调用它一次,并且我不能将其返回类型更改为选项[String]。目前,我正在做以下工作: val myStr = { val s = getSomeString if (s == null || s.isEmpty) "<empty>" else s } val myStr={ val s=getSomeString 如

我有一个返回字符串的方法。如果它返回空字符串或
null
,我想用默认值替换它,例如
“”
。假设它的名称是
getSomeString
,这是一个昂贵的操作,因此我只能调用它一次,并且我不能将其返回类型更改为
选项[String]
。目前,我正在做以下工作:

val myStr = {
  val s = getSomeString
  if (s == null || s.isEmpty) "<empty>" else s
}
val myStr={
val s=getSomeString
如果(s==null | | s.isEmpty)“”else s
}
有没有更简单的方法来实现同样的目标?

val myStr=Option(getSomeString).filterNot(u.isEmpty).getOrElse(“”)
val myStr = Option(getSomeString).filterNot(_.isEmpty).getOrElse("<empty>")
更新

我发布了这个代码,因为我认为这个代码中的意图比I/ER或模式匹配版本清晰,但是我没有考虑性能问题。


正如注释中提到的其他代码,此代码比简单的if/else或模式匹配慢得多(此行将创建大量新对象,这是一个昂贵的操作),因此,当性能出现问题时,请不要使用此代码。

您可以在第一步使用
选项将null替换为空字符串,然后在结果为空时用默认文本替换(无论是因为它最初为空还是因为它为空):

选项(getSomeString.getOrElse(“”).replaceAll(“^$”,“”)

给定一个昂贵的函数:

scala> def s(i: Int): String = i match { case 0=>null case 1=>"" case 2=>"hi" }
s: (i: Int)String
我认为这很容易阅读,并且没有开销,cf:

模式匹配通常只是一个if-else,更小更快(即使考虑到它没有优化
s==“s
s.isEmpty
):


“”+s(i)
String.valueOf
的简写,它当然为空引用值生成字符串
“null”
。我很欣赏SO不仅能快速回答问题,还能鼓励一些开箱思考。

您可以使用隐式值类向
字符串添加方法

像这样使用

import ImplicitClassContainer._

println("hi".getOrDefault("<empty1>"))

println("".getOrDefault("<empty2>"))

val s: String = null
println(s.getOrDefault("<empty3>"))
导入隐式ClassContainer_
println(“hi”.getOrDefault(“”)
println(“.getOrDefault(”)
val s:String=null
println(s.getOrDefault(“”)
因此,即使是对
null
的方法调用也得到了优雅的处理(Scala 2.10.1)。

val myStr=getSomeString match{case”“|null=>”“case s=>s}

如果您不需要更改:

Option(getSomeString).fold("<empty>")(s => s)
选项(getSomeString).fold(“”)(s=>s)
如果需要修改If以获得非空结果。简单的例子:

Option(getSomeString).fold("<empty>")(str => s"xxxxxxxx$str")
选项(getSomeString).fold(“”)(str=>s“xxxxxxxx$str”)

如果不是针对isEmpty测试,您可以直接使用Option(getSomeString)将其转换为Option[String]。在实践中,你会同时得到空字符串和空字符串吗?与原始代码相比,它看起来简单得多(而且,这段代码会比前一段代码慢得多)。我觉得它干净得多。它不像我的答案那么干净和便宜。看看碳足迹。@som snytt你可能很讨厌!没有人考虑过自定义提取器吗?JavAP很难阅读你的文章,看看你的观点。什么是tl;博士如果其他模式匹配更快?@huynhjl-Thx获取反馈。我编辑是为了不埋下线索。(报纸上的术语,不是金属。)这并不是说我希望以此赢得人心。@huynhjl事实上,更确切地说,这是一个不需要动脑筋的问题。但如果孩子们认为使用选项很有趣,那么他们可能会做一些更糟糕的事情,比如在街上闹事,造成真正的混乱。不知道模式匹配也可以匹配
null
。谢谢我从韦伯斯特的推特上了解到,新闻编辑故意拼错了它,“埋葬莱德”。@axaluss我不理解你的评论:答案是:它确实扩展了AnyVal
,我只是想添加doc链接。
scala> :javap -
  Size 1161 bytes
  MD5 checksum 765f5f67b0c574252b059c8adfab1cf0
  Compiled from "<console>"
[...]
         9: getstatic     #26                 // Field scala/Option$.MODULE$:Lscala/Option$;
        12: getstatic     #31                 // Field .MODULE$:L;
        15: iconst_0      
        16: invokevirtual #35                 // Method .s:(I)Ljava/lang/String;
        19: invokevirtual #39                 // Method scala/Option$.apply:(Ljava/lang/Object;)Lscala/Option;
        22: new           #41                 // class $anonfun$1
        25: dup           
        26: invokespecial #42                 // Method $anonfun$1."<init>":()V
        29: invokevirtual #48                 // Method scala/Option.filterNot:(Lscala/Function1;)Lscala/Option;
        32: new           #50                 // class $anonfun$2
        35: dup           
        36: invokespecial #51                 // Method $anonfun$2."<init>":()V
        39: invokevirtual #55                 // Method scala/Option.getOrElse:(Lscala/Function0;)Ljava/lang/Object;
        42: checkcast     #57                 // class java/lang/String
        45: putfield      #17                 // Field res6:Ljava/lang/String;
scala> :javap -r #q
  public java.lang.String q(int);
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=5, args_size=2
         0: getstatic     #19                 // Field $line3/$read$$iw$$iw$.MODULE$:L$line3/$read$$iw$$iw$;
         3: iload_1       
         4: invokevirtual #22                 // Method $line3/$read$$iw$$iw$.s:(I)Ljava/lang/String;
         7: astore_3      
         8: ldc           #24                 // String 
        10: aload_3       
        11: invokevirtual #28                 // Method java/lang/Object.equals:(Ljava/lang/Object;)Z
        14: ifeq          22
        17: iconst_1      
        18: istore_2      
        19: goto          33
        22: aload_3       
        23: ifnonnull     31
        26: iconst_1      
        27: istore_2      
        28: goto          33
        31: iconst_0      
        32: istore_2      
        33: iload_2       
        34: ifeq          44
        37: ldc           #30                 // String <empty>
        39: astore        4
        41: goto          47
        44: aload_3       
        45: astore        4
        47: aload         4
        49: areturn       
scala> def p(i: Int) = "" + s(i) replaceAll ("^null$|^$", "<empty>")
p: (i: Int)String
object ImplicitClassContainer {
  implicit class RichString(val s: String) extends AnyVal {
    def getOrDefault(defaultValue: String): String = {
      s match {
        case null | "" => defaultValue
        case x => x
      }
    }
  }
import ImplicitClassContainer._

println("hi".getOrDefault("<empty1>"))

println("".getOrDefault("<empty2>"))

val s: String = null
println(s.getOrDefault("<empty3>"))
val myStr = getSomeString match { case ""|null => "<empty>" case s => s }
Option(getSomeString).fold("<empty>")(s => s)
Option(getSomeString).fold("<empty>")(str => s"xxxxxxxx$str")