Java8 новые особенности выражения -Lambda

лямбда-выражения

Лямбда-выражение, также известное как замыкания, он должен способствовать наиболее важные новые возможностям Java 8 выпуска.

Лямбда разрешено функционировать в качестве аргумента метода (функции в качестве параметра, передаваемого в процессе).

Лямбда-выражения могут сделать использование кода становится более простым и компактным.

контраст Синтаксис

Синтаксис лямбда-выражение выглядит следующим образом:

(parameters) -> expression
(parameters) ->{ statements; }

Важная особенность

  • Дополнительный типа декларации: не нужно объявлять тип параметра, компилятор может быть унифицирована значением параметра идентификации.
  • Необязательные параметры в скобках: нет необходимости определять параметры в скобках, но ряд параметров должны быть определены круглые скобки.
  • Дополнительные фигурные скобки: если тело содержит заявление, вам не нужно скобку использования.
  • Дополнительное возвращение ключевое слово: Если объект только одно выражение, которое возвращает значение, то компилятор будет автоматически возвращать значение, скобки нужно указать четкое выражение, которое возвращает значение.

Простой пример:

// 1. 不需要参数,返回值为 5 
() -> 5 
 
// 2. 接收一个参数(数字类型),返回其2倍的值 
x -> 2 * x 
 
// 3. 接受2个参数(数字),并返回他们的差值 
(x, y) -> x – y 
 
// 4. 接收2个int型整数,返回他们的和 
(int x, int y) -> x + y 
 
// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void) 
(String s) -> System.out.print(s)
public class Java8Tester {
   public static void main(String args[]){
      Java8Tester tester = new Java8Tester();
 
      // 类型声明
      MathOperation addition = (int a, int b) -> a + b;
 
      // 不用类型声明
      MathOperation subtraction = (a, b) -> a - b;
 
      // 大括号中的返回语句
      MathOperation multiplication = (int a, int b) -> { return a * b; };
 
      // 没有大括号及返回语句
      MathOperation division = (int a, int b) -> a / b;
 
      System.out.println("10 + 5 = " + tester.operate(10, 5, addition));
      System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction));
      System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication));
      System.out.println("10 / 5 = " + tester.operate(10, 5, division));
 
      // 不用括号
      GreetingService greetService1 = message ->
      System.out.println("Hello " + message);
 
      // 用括号
      GreetingService greetService2 = (message) ->
      System.out.println("Hello " + message);
 
      greetService1.sayMessage("Nowcoder");
      greetService2.sayMessage("Google");
   }
 
   interface MathOperation {
      int operation(int a, int b);
   }
 
   interface GreetingService {
      void sayMessage(String message);
   }
 
   private int operate(int a, int b, MathOperation mathOperation){
      return mathOperation.operation(a, b);
   }
}
执行输出结果:

```java
$ javac Java8Tester.java
$ java Java8Tester
10 + 5 = 15
10 - 5 = 5
10 x 5 = 50
10 / 5 = 2
Hello Nowcoder
Hello Google

Переменная Scope

лямбда - выражения могут относиться только к внешнему локальным переменным последнему знаку, что означает , что определение локальных переменных не может быть изменено в пределах экстерриториального применения лямбды, в противном случае ошибке компиляции.
Введите следующий код в Java8Tester.java файле:

public class Java8Tester {
 
   final static String salutation = "Hello! ";
 
   public static void main(String args[]){
      GreetingService greetService1 = message ->
      System.out.println(salutation + message);
      greetService1.sayMessage("Nowcoder");
   }
 
   interface GreetingService {
      void sayMessage(String message);
   }
}

Реализация вышеуказанного сценария, выход:

$ javac Java8Tester.java
$ java Java8Tester
Hello! Nowcoder

Мы также можем получить доступ к локальным переменным наружного слоя непосредственно на лямбда-выражения:

public class Java8Tester {
    public static void main(String args[]) {
        final int num = 1;
        Converter<Integer, String> s = (param) -> System.out.println(String.valueOf(param + num));
        s.convert(2);  // 输出结果为 3
    }
 
    public interface Converter<T1, T2> {
        void convert(int i);
    }
}

Локальные выражения переменной лямбды не могут быть объявлены как окончательные, но не должны быть изменены позже в коде (то есть, имея рецессивный семантико-конечный)

int num = 1; 
Converter<Integer, String> s = (param) -> System.out.println(String.valueOf(param + num));
s.convert(2);
num = 5; 
//报错信息:Local variable num defined in an enclosing scope must be final or effectively
 final

В выражениях лямбда, которые не имеют права объявить локальную переменную с тем же именем в качестве параметров или локальных переменных.

String first = ""; 
Comparator<String> comparator = (first, second) -> Integer.compare(first.length(), second.length());  //编译会出错

Другие новые функции (обновление)

Java8 новых функции - метод ссылка
Java8 новые функции - функции интерфейса
Java8 новых функций - метод по умолчанию

Опубликовано 26 оригинальных статей · вона похвала 6 · просмотров 2943

рекомендация

отblog.csdn.net/weixin_45676630/article/details/104884384