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<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
for(Integer n: list) {
System.out.println(n);
}
//New way:
List<Integer> 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);