【发布时间】:2021-01-09 18:08:30
【问题描述】:
我正在将一个 Java 项目迁移到 Scala 并遇到以下代码:
private void searchClauses( TCustomSqlStatement select ) {
if ( !searchInClauses.contains( select ) ) {
searchInClauses.add( select );
}
else {
return;
}
if ( select instanceof TSelectSqlStatement ) {
TSelectSqlStatement statement = (TSelectSqlStatement) select;
HashMap clauseTable = new HashMap( );
if ( statement.getWhereClause( ) != null ) {
clauseTable.put( ( statement.getWhereClause( ).getCondition( ) ),
ClauseType.where );
}
for ( TExpression expr : (TExpression[]) clauseTable.keySet( ).toArray( new TExpression[0] ) ) {
ClauseType type = (ClauseType) clauseTable.get( expr );
searchExpression( expr,
select,
type == null ? null : type.name( ) );
searchTables( select );
}
}
}
在 IF 条件的 else 块中,之前的开发者只写了return,它甚至没有返回任何东西。如果它没有返回 null,那么只有 return 有什么用?
由于我无法理解该特定行,因此我不明白如何在 Scala 中转换该特定 IF 条件。
谁能告诉我如何在 Scala 中编写相同的块,而不会影响低于第一个 IF-ELSE 条件的代码?
【问题讨论】:
-
该方法返回void,所以没有(就像Scala中的Unit)。
return只是为了中止方法的执行。 -
好的,在这种情况下,我怎样才能中断 Scala 中的方法执行,而不是在 Scala 中使用
return语句? -
嗯,Scala 提供了不同的提早返回的方法,包括:使用
return(不鼓励但快速且有用),编写自己的 (tail) 递归函数函数,您可以随时中止。使用具有提前返回的高阶函数,例如forall或collectFirst。或者使用带有短路的 Monad,如 Option 或 Either。 - 如果不进一步了解代码,很难判断在这种情况下哪一个是最好的。 -
方法签名声明它返回 void,这与返回 null 不同。 null 是一切的子类型。在您的代码库中,返回的目的是退出函数
-
这是一个提前退出方法softwareengineering.stackexchange.com/questions/18454/… Scala 支持stackoverflow.com/questions/6915701/… 但最好重写代码以便方法具有唯一的退出点。
标签: java scala short-circuiting