Лямбда-выражения и исключения в Java

Лямбда-выражения и исключения в Java

Лямбда-выражение может генерировать исключение. Но если оно генерирует проверяемое исключение, то последнее должно быть совместимо с исключени­ями, перечисленными в выражении throws из объявления абстрактного метода в функциональном интерфейсе.

Эта особенность демонстрируется в приведенном ниже примере, где вычисляется среднее числовых значений типа double в масси­ве.

А если лямбда-выражению передается массив нулевой длины, то генерируется исключение типа EmptyArrayException.

Как следует из данного примера, это ис­ключение перечислено в выражении throws из объявления метода func() в функциональном интерфейсе DoubleNumericArrayFunc.

//    -

interface DoubleNumericArrayFunc {
    double func(double[] n) throws EmptyArrayException;
}

class EmptyArrayException extends Exception {
    EmptyArrayException() {
    super(" ");
    }
}

class LambdaExceptionDemo {

    public static void main(String args[]) throws EmptyArrayException {

    double[] values = { 1.0, 2.0, 3.0, 4.0 };

    //   -   
    //   double  

    DoubleNumericArrayFunc average = (n) -> {

        double sum = 0;

        if(n.length == 0) {
        throw new EmptyArrayException();
        }

        for(int i = 0; i < n.length; i++) {
        sum += n[i];
        }

        return sum / n.length;
    };

    System.out.println("  " + average.func(values));

    //       
    System.out.println("  " + average.func(new double[0]));
    }
}

Программа выводит следующее:

pro-java.ru@admin:~$ javac lamexc.java 
pro-java.ru@admin:~$ java LambdaExceptionDemo
  2.5
Exception in thread "main" EmptyArrayException:  
    at LambdaExceptionDemo.lambda$main$0(lamexc.java:27)
    at LambdaExceptionDemo.main(lamexc.java:40)
pro-java.ru@admin:~$

В результате первого вызова метода average.func() возвращается среднее значение 2.5. А при втором вызове этому методу передается массив нулевой длины, что приводит к генерированию исключения типа EmptyArrayException.

Напомним, что наличие выражения throws В объявлении метода func() обязательно.

Без этого программа не будет скомпилирована, поскольку лямбда-выражение перестанет быть совместимым с методом func().

Данный пример демонстрирует еще одну важную особенность лямбда-выражений. Обратите внимание на то, что параметр, указываемый при объявлении метода func() в функциональном интерфейсе DoubleNumericArrayFunc, обозначает массив, тогда как параметр лямбда-выражения просто указан как n, а не n[].

Напомним, что тип параметра лямбда-выражения выводится из целевого контекста. В данном случае целевым контекстом является массив типа double[], поэтому и параметр n относится к типу double[].

Следовательно, указывать этот параметр как n[] совсем не обязательно и даже недопустимо. И хотя его можно было бы явно указать как double[] n, это не дало бы в данном случае никаких преимуществ.

Интересное видео для нашей аудитории

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *