Lambda表达式

Java为什么需要Lambda表达式

Lambda表达式为Java添加了缺少的函数式编程的特点,将函数作为一个参数传递。

初步认识

Lambda表示是一个没有声明、没有修饰符、返回值声明、名字的方法。当某个方法只会使用一次,用lambda表达式定义就可以很简短。

Lambda表示的结构

通常使用(argument) -> (body)语法书写,例如:

(arg1, arg2) -> {body}
(type1, type2) -> {body}

一些常见的例子

(int a, int b) -> { return a + b; }
() -> System.out.println("hello world");
() -> 42
() -> { return 3.1415 };

表达式结构的一些规范

  • 一个Lambda表达式可以有零个或者多个参数
  • 参数的类型可以明确声明,也可以根据上下文判断
  • 当只有一个参数时,圆括号可以省略。例如:a -> return a
  • 如果表达式的主体只包含一条语句,花括号{}可以省略
  • 返回类型与主体的返回类型相同,如果没有,就返回null

在函数式接口中的使用

函数式接口就是只包含一个抽象方法的接口。例如java.lang.Runnable就是一个函数式接口,因为Runnable接口中只声明了一个void run()方法。

现在可以这么初始化一个线程

new Thread(
  () -> System.out.println("hello");
).start();

在上面的代码中,编译器会根据线程类的构造函数参数名public Thread(Runnable r){}自动推断,将Lambda表达式赋给Runnable接口。

利用@Funcationallnterface对接口使用,就可以自己声明一个函数式接口。

还可以使用双冒号(::)操作符将一个方法转化为lambda表达式

//Old way:
List list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
for(Integer n: list) {
   System.out.println(n);
}

//New way:
List list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
list.forEach(n -> System.out.println(n));


//or we can use :: double colon operator in Java 8
list.forEach(System.out::println);

你可能感兴趣的:(Lambda表达式)