前文介绍了java8得一些新特性,与优点,也是为本次学习java8新特性制定一个学习的方向,后面几篇会根据上文中得新特性一一展开学习。本文就从java8新特性中比较重要的Lambda表达式开始学习。
首先:为什么要使用lambda表达式?
Lambda是一个匿名函数,我们可以baLambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以写出更简洁,更灵活的代码。作为一种更紧凑得代码风格,使得java得语言表达能力得到提升。
一、Lambda 表达式的基础语法:
Java8中引入了一个新的操作符 "->" 该操作符称为箭头操作符或 Lambda 操作符箭头操作符将 Lambda 表达式拆分成两部分:
左侧:Lambda 表达式的参数列表
右侧:Lambda 表达式中所需执行的功能, 即 Lambda 体
- 语法格式一:无参数,无返回值 ———— () -> System.out.println("Hello Lambda!");
@Test public void test1(){ int num = 0;//jdk 1.7 前,必须是 final //java8之前写法 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(); }
- 语法格式二:有一个参数,并且无返回值 ———— (x) -> System.out.println(x);
-
@Test public void test2(){ Consumer<String> con = (x) -> System.out.println(x); con.accept("Lambda威武!"); }
- 语法格式三:有两个以上的参数,有返回值,并且 Lambda 体中有多条语句
@Test public void test3(){ Comparator<Integer> com = (x, y) -> { System.out.println("函数式接口"); return Integer.compare(x, y); }; }
-
语法格式四:若 Lambda 体中只有一条语句, return 和 大括号都可以省略不写 —— Comparator<Integer> com = (x, y) -> Integer.compare(x, y);
@Test public void test4(){ Comparator<Integer> com = (Integer x, Integer y) -> Integer.compare(x, y); }
-
语法格式六:Lambda 表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出,数据类型,即“类型推断” —— (Integer x, Integer y) -> Integer.compare(x, y);
@Test public void test4(){ Comparator<Integer> com = (x, y) -> Integer.compare(x, y); }
二、Lambda 表达式需要“函数式接口”的支持
- 函数式接口:接口中只有一个抽象方法的接口,称为函数式接口。 可以使用注解 @FunctionalInterface 修饰 可以检查是否是函数式接口
@FunctionalInterface public interface myLambdaModle<T> { public int getValue(T t2); }
- 需求:对两数进行运算
//需求:对一个数进行运算 @Test public void test6(){ Integer num = operation(100, (x) -> x * x); System.out.println(num); System.out.println(operation(200, (y) -> y + 200)); } public Integer operation(Integer num, myLambdaModle my){
return mf.getValue(num);
}