В Scala вы можете использовать implicits для добавления методов isEmpty()
и nonEmpty()
в API DataFrame, что сделает код более приятным для чтения.
object DataFrameExtensions {
implicit def extendedDataFrame(dataFrame: DataFrame): ExtendedDataFrame =
new ExtendedDataFrame(dataFrame: DataFrame)
class ExtendedDataFrame(dataFrame: DataFrame) {
def isEmpty(): Boolean = {
Try{dataFrame.first.length != 0} match {
case Success(_) => false
case Failure(_) => true
}
}
def nonEmpty(): Boolean = !isEmpty
}
}
Здесь другие методы также могут быть добавлены. Чтобы использовать неявное преобразование, используйте import DataFrameExtensions._
в файле, который вы хотите использовать расширенную функциональность. Впоследствии методы могут использоваться непосредственно так:
val df: DataFrame = ...
if (df.isEmpty) {
// Do something
}
Вы можете моделировать продолжать использование goto и маркируете .
DECLARE
done BOOLEAN;
BEGIN
FOR i IN 1..50 LOOP
IF done THEN
GOTO end_loop;
END IF;
<<end_loop>> -- not allowed unless an executable statement follows
NULL; -- add NULL statement to avoid error
END LOOP; -- raises an error without the previous NULL
END;
Хотя это немного сложно и просто фальшивка, можно использовать исключение этот путь:
DECLARE
i NUMBER :=0;
my_ex exception;
BEGIN
FOR i IN 1..10
LOOP
BEGIN
IF i = 5 THEN
raise my_ex;
END IF;
DBMS_OUTPUT.PUT_LINE (i);
EXCEPTION WHEN my_ex THEN
NULL;
END;
END LOOP;
END;
Это не доступно в 10 г, однако это новая возможность в 11G
Можно ли осуществить рефакторинг IFS в функцию, возвращающуюся в соответствующей точке (рано при необходимости). Тогда поток управления возьмет в цикле в правильном месте.
, который имеет смысл?
В Oracle существует подобный оператор под названием ВЫХОД, который или выходит из цикла или функции/процедуры (если нет никакого цикла для выхода от). Можно добавить, КОГДА проверить на некоторое условие.
Вы могли переписать вышеупомянутый пример следующим образом:
DECLARE
done BOOLEAN;
BEGIN
FOR i IN 1..50 LOOP
EXIT WHEN done;
END LOOP;
END;
Это не может быть достаточно, если Вы хотите выйти от в глубине души некоторых вложенных циклов и логики, но намного более ясно, чем несколько GOTOs и АННУЛИРУЕТ.
Не совсем элегантно, но просто:
DECLARE
done BOOLEAN;
BEGIN
FOR i IN 1..50 LOOP
IF done THEN
NULL;
ELSE
<do loop stuff>;
END IF;
END LOOP;
END;