java8 lambda表达式(一)(转载)
2018-07-04 本文已影响3人
lconcise
一 什么是lambda?
Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使 Java的语言表达能力得到了提升。
匿名内部类的写法
public void demo1(){
Comparator<Integer> comparator = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return Integer.compare(o1, o2);
}
};
Runnable runnable = new Runnable() {
@Override
public void run() {}
};
}
Lambda表达式的写法
public void demo2(){
Comparator<Integer> comparator = (x,y) -> Integer.compare(x, y);
Runnable runnable = () -> System.out.println("lambda表达式");
}
二 lambda表达式的语法
lambda表达式的一般语法:
(Type1 param1, Type2 param2, ..., TypeN paramN) -> {
statment1;
statment2;
//.............
return statmentM;
}
包含三个部分:参数列表,箭头(->),以及一个表达式或语句块。
1.一个括号内用逗号分隔的形式参数,参数是函数式接口里面方法的参数
2.一个箭头符号:->
3.方法体,可以是表达式和代码块,方法体是函数式接口里面方法的实现,如果是代码块,则必须用{}来包裹起来,且需要一个return 返回值,但有个例外,若函数式接口里面方法返回值是void,则无需{}。
总体看起来像这样:
(parameters) -> expression 或者 (parameters) -> { statements; }
上面的lambda表达式语法可以认为是最全的版本,写起来还是稍稍有些繁琐。别着急,下面陆续介绍一下lambda表达式的各种简化版:
- 参数类型省略–绝大多数情况,编译器都可以从上下文环境中推断出lambda表达式的参数类型。这样lambda表达式就变成了:
(param1,param2, ..., paramN) -> {
statment1;
statment2;
//.............
return statmentM;
}
- 单参数语法:当lambda表达式的参数个数只有一个,可以省略小括号。lambda表达式简写为:
param1 -> {
statment1;
statment2;
//.............
return statmentM;
}
- 单语句写法:当lambda表达式只包含一条语句时,可以省略大括号、return和语句结尾的分号。lambda表达式简化为:
param1 -> statment
下面看几个例子:
demo1:无参,无返回值,Lambda 体只需一条语句
Runnable runnable = () -> System.out.println("lamda表达式");
demo2:Lambda 只需要一个参数
Consumer<String> consumer=(x)->System.out.println(x);
demo3:Lambda 只需要一个参数时,参数的小括号可以省略
Consumer<String> consumer=x->System.out.println(x);
demo4:Lambda 需要两个参数
Comparator<Integer> comparator = (x, y) -> Integer.compare(x, y);
demo5:当 Lambda 体只有一条语句时,return 与大括号可以省略
BinaryOperator<Integer> binaryOperator=(x,y)->(x+y);
demo6:数据类型可以省略,因为可由编译器推断得出,称为“类型推断”
BinaryOperator<Integer> bo=(x,y)->{
System.out.println("Lambda");
return x+y;};
类型推断
上述 Lambda 表达式中的参数类型都是由编译器推断得出的。Lambda 表达式中无需指定类型,程序依然可以编译,这是因为 javac 根据程序的上下文,在后台推断出了参数的类型。Lambda 表达式的类型依赖于上下文环境,是由编译器推断出来的。这就是所谓的 “类型推断”。