一、基本语法
1. (parameters) -> expression 参数+表达式
此语法下表达式将执行并返回结果
2.(parameters) ->{ statements; } 参数+语句块
①return语句会吧控制权交给匿名方法的调用者
②break和continue只能在循环中使用
表达式实例:
(int x, int y) -> x + y ;
() -> 42 ;
(String s) -> { System.out.println(s); }
注意:Lambda表达式只能创建接口interface对象
Comparator<String> c = (String s1, String s2) -> s1.compareToIgnoreCase(s2);
String[] atp = {"Rafael Nadal", "Novak Djokovic",
"Stanislas Wawrinka",
"David Ferrer","Roger Federer",
"Andy Murray","Tomas Berdych",
"Juan Martin Del Potro"};
//将数组转为list再使用lambda
List<String> players = Arrays.asList(atp);
players.forEach((player) ->{
System.out.println(player + "; ");
});
二、目标类型
需要注意的是,函数式接口的名称并不是lambda表达式的一部分。那么问题来了,对于给定的lambda表达式,它的类型是什么?答案是:它的类型是由其上下文推导而来。
下面给出了这些带有目标类型的上下文:
①变量声明
②赋值
③返回语句
④数组初始化器
⑥方法和构造方法的参数
⑦lambda表达式函数体
⑧条件表达式(? :
)
⑨转型(Cast)表达式
三、方法引用(Method references)
Consumer<Integer> b1 = System::exit; // void exit(int status)
Consumer<String[]> b2 = Arrays:sort; // void sort(Object[] a)
Consumer<String> b3 = MyProgram::main; // void main(String... args)
Runnable r = Myprogram::mapToInt // void main(String... args)
方法引用的种类
- 静态方法引用:
ClassName::methodName
- 实例上的实例方法引用:
instanceReference::methodName
- 超类上的实例方法引用:
super::methodName
- 类型上的实例方法引用:
ClassName::methodName
- 构造方法引用:
Class::new
- 数组构造方法引用:
TypeName[]::new
持续更新。。。。。。。。。。。。。