lambda是一个匿名函数,是一段可以传递的代码,也可以理解为函数参数。基本形式() -> {}
简化了很多无用的代码,例如:相比匿名内部类定义比较器
/**
* 匿名内部类
*/
@Test
public void test1(){
// 匿名内部类实现接口,匿名内部类的实例作为参数
Comparator<Integer> com = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return Integer.compare(o1,o2);
}
};
TreeSet<Integer> ts = new TreeSet<>(com);
}
/**
* lambda表达式
*/
@Test
public void test2(){
Comparator<Integer> com = (x,y) -> Integer.compare(x,y);
// 更简洁可以这样写
TreeSet<Integer> ts = new TreeSet<>(Integer::compare);
}
对于一些重复代码可以使用相应的设计模式进行优化,例如定义比较器接口然后进行分别实现,不过代码量也不小。
总之就是一个词,简洁。
语法格式一:无参数无返回值: () -> { }
/**
* 匿名内部类
*/
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("hello lambda!");
}
};
/**
* lambda
*/
Runnable r1 = () -> System.out.println("hello Lambda");
语法格式二:一个参数,并且无返回值,若只有一个参数,小括号可以不写
Consumer<String> con = (x)->System.out.println(x);
con.accept("hello lambda!");
语法格式三:两个以上参数,并且lambda体中有多条语句,且有返回值。如果只有一条语句,return和大括号都可以不写
Comparator<Integer> com = (x,y)->{
System.out.println("函数式接口");
return Integer.compare(x,y);
};
语法格式四:Lambda表达式的参数列表的数据类型可以省略不写,因为JVM的编译器可以通过上下文推断出数据类型,这个过程我们称之为类型推断。也可以写类型,但是如果要写类型,那么所以参数的类型都要写上。

这道题答案选:A、C
匿名内部类的缺陷:
InvokeDynamic指令: