lambda表达式依赖于函数式接口
函数式接口——只有一个抽象方法
lambda表达式一共六种情况!总结如下
/**
* lambda表达式
* (o1,o2)->Integer.compare(o1,o2)
* 格式:
* -> :lambda操作符/箭头操作符
* -> 右边:lambda体——重写的抽象方法的方法体
* -> 左边:lambda形参列表——接口中的抽象方法的形参列表
*使用:六种情况
* 总结:
* ->左边:lambda形参列表的参数类型可以省略(类型推断),如果lambda形参列表只有一个参数,其一对()也可以省略
* ->右边:lambda体,一般是一对{}包裹,如果只有一条执行语句(可能是return语句),可以省略{}(可以省return)
*lambda表达式的本质——作为接口的实例/对象
* 接口要求:必须是函数式接口——只有一个抽象方法,创建实例的时候就不需要知道方法的名称,因为只有一个
*
*/
public class Demo01 {
//1:无参数,无返回值
@Test
public void test01(){
//runnable接口的情况
Runnable r1=new Runnable() {
@Override
public void run() {
System.out.println("111");
}
};
Runnable r2=()-> System.out.println("222");
r1.run();
r2.run();
}
//2:lambda需要一个参数,但是没有返回值
@Test
public void test02(){
Consumer<String> con=new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
};
con.accept("sss");
Consumer<String> con1=(String s)-> System.out.println(s);
con1.accept("xsas");
}
//3:数据类型可以省略,因为可以由编译器推断出,称为“类型推断”
@Test
public void test03(){
Consumer<String> con1=(String s)-> System.out.println(s);
con1.accept("xxxx");
Consumer<String> con2=( s)-> System.out.println(s);
con1.accept("yyyy");
}
//4:lambda若只需要一个参数的时候,参数的小括号可以省略不写
@Test
public void test04(){
Consumer<String> con1=(String s)-> System.out.println(s);
con1.accept("xxxx");
Consumer<String> con2=s-> System.out.println(s);
con1.accept("yyyy");
}
//5:lambda需要两个或以上的参数,多条执行语句,并且可以有返回值
@Test
public void test05(){
Comparator<Integer> com=new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
System.out.println(o1);
System.out.println(o2);
return o1.compareTo(o2);
}
};
System.out.println(com.compare(11, 2));
Comparator<Integer> com2=(o1,o2)->{
System.out.println(o1);
System.out.println(o2);
return o1.compareTo(o2);
};
com2.compare(11,12);
}
//6:当lambda体只有一条执行语句的时候,return与大括号若有,都可以忽略——意思是只有一条执行语句,且
//该执行语句是return语句,则大括号和return都可以省略,如果非return语句,则可以省大括号
@Test
public void test06(){
Comparator<Integer> com=new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
};
System.out.println(com.compare(11, 23));
Comparator<Integer> com1=(o1,o2)-> o1.compareTo(o2);
System.out.println(com1.compare(11, 23));
}
}