Scala代码片段作为Java
我目前正在完成一个Scala项目,并将其转换为Java。一切进展顺利,但我无意中发现了以下片段:Scala代码片段作为Java,java,scala,Java,Scala,我目前正在完成一个Scala项目,并将其转换为Java。一切进展顺利,但我无意中发现了以下片段: Pattern fileNamePattern = Pattern.compile("^(\\w+).*(_\\w+\\.xml)$"); new File(filePath).getName match { case FileNamePattern(first, last) => return first + last case n =&g
Pattern fileNamePattern = Pattern.compile("^(\\w+).*(_\\w+\\.xml)$");
new File(filePath).getName match {
case FileNamePattern(first, last) => return first + last
case n => return n
}
我理解正则表达式,一个或多个字母、数字或标点符号,后跟0个或多个字符,后跟一个或多个字母、数字或标点符号。这个函数的目的是从文件路径获取文件名,但在Java中这是非常简单的,所以我认为Scala开发人员不会让它变得如此复杂
问题是,我不想走在前面,假设开发人员是个白痴,而他们可能正试图做一些更聪明的事情,而我对Scala的缺乏经验让我看不到这一点。那么,请有人解释一下:
- 语法与match匹配
- 到底是从哪里来的
- 这段代码片段的Java等价物/文档
match
构造用于进行模式匹配。基本上,match
的左侧是要与右侧的模式进行匹配的对象。生成的代码按照模式出现的顺序测试每个模式,如果模式与对象匹配,则执行=>
之后的代码
match
表达式中的first
和last
变量是模式匹配机制绑定的变量,当模式出现时,它们与对象匹配。它们的值将是要匹配的对象图中的对应值。换句话说,它们由模式隐式声明,并将在=>
之后的“result”子句中正确初始化
经典例子:
trait Expr
case class Const(val value: Int) extends Expr
case class Add(val left: Expr, val right: Expr) extends Expr
def evaluate(exp: Expr): Int = exp match {
case Const(cv) => cv
case Add(exp1, exp2) => evaluate(exp1) + evaluate(exp2)
case _ => throw new IllegalArgumentException("did not understand: " + exp)
}
Scala的正则表达式对象提供了对模式匹配的特殊支持(通过其unapply
/unplyseq
方法)。在这种情况下,如果正则表达式与getName
返回的字符串匹配,那么变量first
和last
将分别绑定到与正则表达式的第一个子组和第二个子组匹配的子字符串
Java没有类似于match
的语言结构。等效的Java代码将非常冗长和麻烦。可能看起来像
final String name = (new File(filePath).getName());
final Matcher matcher = FileNamePattern.match(name);
if (matcher.matches()) {
final String first = matcher.group(1);
final String last = matcher.group(2);
return first + last;
} else {
return name;
}
很好的解释和功能替换代码(除了
组
是私有的)+1操作。抢手货我的意思是,显然不是组
。但\w
这件小事肯定不是空白。上帝,所有这些Scala都在煎熬我的大脑。为这个错误道歉。
final String name = (new File(filePath).getName());
final Matcher matcher = FileNamePattern.match(name);
if (matcher.matches()) {
final String first = matcher.group(1);
final String last = matcher.group(2);
return first + last;
} else {
return name;
}