目录
//语法格式四:有多个参数,有返回值,Lambda体中有多条语句
//语法格式五:Lambda体中只有一行语句,return和大括号可以不写
//语法格式六:Lambda表达式的参数列表的数据类型可以省略不写,因为JVM编译器可以通过上下文推断出数据类型,即“类型推断”
Lambda 表达式语法(对接口的实现)
Lambda 是一个匿名函数,可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。
Java8引入了一个新的操作符 “->” 该操作符称为箭头符或lambda 操作符,箭头操作符将 Lambda 表达式拆分成两部分:
左侧:Lambda 表达式的参数列表;
右侧:Lambda 表达式中所需要执行的功能,即 Lambda 体;
语法格式
//语法格式一:无参,无返回值
Runnable r1 = () -> { System.out.println("hello Lambda"); };
//语法格式二:有一个参数,无返回值
Consumer c = (x) ->{System.out.println(x); };
//语法格式三:若只有一个参数,小括号可以不写
Consumer con = x ->{System.out.println(x); };
//语法格式四:有多个参数,有返回值,Lambda体中有多条语句
Comparator<Integer> com = (x,y)->{
System.out.println("函数式接口");
return Integer.compare(x,y);
};
//语法格式五:Lambda体中只有一行语句,return和大括号可以不写
Comparator<Integer> c = (x,y)-> Integer.compare(x,y);
//语法格式六:Lambda表达式的参数列表的数据类型可以省略不写,因为JVM编译器可以通过上下文推断出数据类型,即“类型推断”
Comparator<Integer> c = (Integer x,Integer y)-> Integer.compare(x,y);
Comparator<Integer> c2 = (x,y)-> Integer.compare(x,y);
上联:左右遇一括号省
下联:左侧推断类型省
横批:能省则省
public class TestLambda2 {
//语法格式一:无参,无返回值
@Test
public void test01(){
int num = 0;//JDK1.7前,必须是final,1.8不用加,但本质上还是final
//内部类写法
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("hello world"+num);
}
};
r.run();
System.out.println("===============================");
//Lambda写法
Runnable r1 = () -> { System.out.println("hello Lambda"); };
r1.run();
}
//语法格式二:有一个参数,无返回值
@Test
public void test02(){
Consumer c = (x) ->{System.out.println(x); };
c.accept("有一个参数,无返回值");
System.out.println("=================================");
//语法格式三:若只有一个参数,小括号可以不写
Consumer con = x ->{System.out.println(x); };
con.accept("若只有一个参数,小括号可以不写");
}
//语法格式四:有多个参数,有返回值,Lambda体中有多行代码
@Test
public void test03(){
Comparator<Integer> com = (x,y)->{
System.out.println("函数式接口");
return Integer.compare(x,y);
};
System.out.println("================");
//语法格式五:Lambda体中只有一行语句,return和大括号可以不写
Comparator<Integer> c = (x,y)-> Integer.compare(x,y);
}
//语法格式六:Lambda表达式的参数列表的数据类型可以省略不写,因为JVM编译器可以通过上下文推断出数据类型,即“类型推断”
@Test
public void test04(){
//语法格式五:Lambda体中只有一行语句,return和大括号可以不写
Comparator<Integer> c = (Integer x,Integer y)-> Integer.compare(x,y);
Comparator<Integer> c2 = (x,y)-> Integer.compare(x,y);
}
//类型推断
@Test
public void test05(){
String[] s = {"aaa","bbb","bbb"};
//无法完成类型推断
//String[] str;
//str = {"aaa","bbb","bbb"};
List<String> list = new ArrayList<>();
//类型推断,无需写出Map里面的参数类型(1.8)
show(new HashMap<>());
}
public void show(Map<String, Integer> map){
}
}
函数式接口
使用 Lambda 表达式需要函数式接口的支持;
函数式接口:接口中只有一个抽象方法(Object类中的方法忽略)。或者使用了@FunctionInterface 注解的接口,为函数式接口。
//定义一个函数式接口
@FunctionalInterface
public interface MyFun {
public Integer getValue(Integer num);
}
//需求:对一个数进行运算
@Test
public void test06(){
System.out.println(operation(100,num -> num*num));
}
//使用了策略设计模式
public Integer operation(Integer num, MyFun mf){
return mf.getValue(num);
}
2686

被折叠的 条评论
为什么被折叠?



