Lambda表达式
表达式的基础语法
java8 中引入了新的操作符“-> ”,这个操作符称为箭头操作符,他的作用 是将Lambda表达式拆分成两部分:
左侧:Lambda 表达式的参数列表
右侧: Lambda 表达式中所需要执行的功能,也就是Lambda体
Lambda表达式需要接口去支持,且接口的抽象方法不能太多
语法格式
-
无参无返回值:
()->System.out.println();
或者() ->
System.out.println(“hello”);` 例如:
一般写法:
public void test1() { Runnable r = new Runnable() { @Override public void run() { System.out.println("Hello"); } }; System.out.println("---------------"); //调用 r.run(); }
Lambda表达式的写法
public void test2() { Runnable r=() -> System.out.println("Hello Lambda!!!"); r.run(); }
相比看起来确实很简单,不再需要去写出匿名内部类。而且调用的方法没有变化。
-
有一个参数,无返回值 (x)->System.out.println(x);
int i =2; public void test3(){ Consumer<String> con = new Consumer<String>() { @Override public void accept(String s) { System.out.println(i); } }; Consumer<String> con1 =(x) -> System.out.println(x); con.accept("1"); con1.accept("1"); }
大家可以猜测一下输出的结果是什么呢?
2
1
-
有一个参数,一个返回值
x->System.out.println(x);
小括号可以省略不写@Test public void test3(){ /*Consumer<String> con = new Consumer<String>() { @Override public void accept(String s) { System.out.println(i); } };*/ Consumer<String> con1 =x -> System.out.println(x); con1.accept("1"); //con.accept("1"); }
-
有两个以上的参数,并且Lambda体中有多个返回值。且Lambda体有多条语句==(x,y)->{语句1;语句2;};==
public void test04(){ Comparator<Integer> com = (x,y)->{ System.out.println("函数式接口"); return Integer.compare(x,y); }; }
- 格式5:Lambda体只有一条语句,return 和大括号都可以不写
public void test04(){ Comparator<Integer> com = (x,y)-> Integer.compare(x,y); }
-
格式6:Lambda表达式的参数列表的数据类型可以省略不写 ,JVM编译器会自动判断数据类型
总结
- 左右遇一括号省:左侧只有一个参数时候括号可以省略;右侧只有一条语句的时候大括号省。
- 左侧推断类型省:左侧可以通过上下文来推断出参数类型,因此可以省略。
- Lambda表达式需要“函数式接口”的支持。函数式接口:一个接口中只有一个抽象方法时,称为函数式接口。我们可以使用注解@FunctionInterface修饰来检查是否是函数式接口
存在不足,欢迎指出。
-