Fork me on GitHub

java8中Lambda表达式

Lambda表达式基础语法

Lambda表达式在Java中引入了一个新的语法元素和操作符“->”,改操作符成为箭头操作符或者Lambda表达式操作符。它将Lambda分为两部分:
左侧:Lambda 表达式的参数列表
右侧:Lambda 表达式要执行的功能,即Lambda体

语法格式一:无参数,无返回值

() -System.out.println(“hello Lambda”);

/**
 * 语法格式一:无参数,无返回值
 * () -> System.out.println("Hello Lambda")
 */
@Test
public void test1(){
    int num = 0;//Jdk以前,必须加final;1.8可以省略
    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();
}

语法格式二:Lambda需要一个参数,无返回值

(x) -System.out.println(“Hello Lambda”)

 /**
 * 语法格式二:有一个参数,无返回值
 * (x) -> System.out.println("Hello Lambda")
 */
@Test
public void test2(){
    Consumer<String> cons = (x) -> System.out.println(x);
    cons.accept("我爱孟楠楠");
}

语法格式三:有一个参数,无返回值,小括号可以省略不写

x -System.out.println(“Hello Lambda”)

/**
 * 语法格式三:有一个参数,无返回值,小括号可以省略不写
 * x -> System.out.println("Hello Lambda")
 */
@Test
public void test3(){
    Consumer<String> cons = x -> System.out.println(x);
    cons.accept("我爱中国");
}

语法格式四:有两个以上参数,有返回值,并且Lambda体中有多条语句

Comparator<Integercom = (x,y) -{

System.out.println("函数式接口");
return Integer.compare(x,y);
};
/**
 * 语法格式四:有两个以上参数,有返回值,并且Lambda体中有多条语句
 * Comparator<Integer> com = (x,y) -> {
 *           System.out.println("函数式接口");
 *          return Integer.compare(x,y);
 };
 */
@Test
public void test4(){
    Comparator<Integer> com = (x,y) -> {
      System.out.println("函数式接口");
      return Integer.compare(x,y);
    };
    com.compare(3,5);

}

语法格式五:若Lambda体中只有一条语句,大括号和return都可以忽略不写

Comparator<Integercom = (x,y) -Integer.compare(x,y);

/**
 * 语法格式五:若Lambda体中只有一条语句,大括号和return都可以忽略不写
 * Comparator<Integer> com = (x,y) -> Integer.compare(x,y);
 */
@Test
public void test5(){
    Comparator<Integer> com = (x,y) -> {
        System.out.println("函数式接口");
        return Integer.compare(x,y);
    };

}

语法格式六:Lambda表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出,数据类型,即“类型推断”

/**
 * 语法格式六:Lambda表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出,数据类型,即“类型推断”
 * Comparator<Integer> com = (Integer x,Integer y) -> Integer.compare(x,y);
 * 小括号中的Integer可以省略,因为前面Comparator中已经指定了Integer类型,可以通过类型上下文推断出想x,y的类型
 */
@Test
public void test6(){
    Comparator<Integer> com = (x,y) ->  Integer.compare(x,y);
}

Lambda表达式需要“函数式接口”的支持

函数式接口:接口中只有一个抽象方法的接口,成为函数式接口。可以使用注解@FunctionalInterface修饰,可以检查是否是函数式接口