JAVA基础 -- java8新特性一之 lambda表达式

如果需要使用到lambda表达式,那么必须要了解函数式接口。

 什么是函数式(Functional)接口:一个接口有且仅有一个抽象方法,那么,这个接口,我们把它叫做函数式接口。


举例:

    (o1,o2) -> Integer.compare(o1,o2);


       左边( (o1,o2) ):lambda形参列表  (其实就是接口中的抽象方法的形参列表)。

       右边( Integer.compare(o1,o2); ):lambda体  (其实就是重写抽象方法的方法体)。


Lambda使用(六种情况):

//第一种 无参数,无返回值

@Test

publicvoidlambda01(){

Runnable r1 =newRunnable() {

@Override

publicvoidrun(){

System.out.println("新建一个初始化线程");

            }

        };

        r1.run();

System.out.println("*********************************");

//使用lambda表达式之后

Runnable r2 = () -> System.out.println("新建一个初始化线程");

        r2.run();

    }

//第二种 有参数,无返回值

@Test

publicvoidlambda02(){

Consumer c1 =newConsumer() {

@Override

publicvoidaccept(Integer integer){

System.out.println("使用消费者"+ integer);

            }

        };

c1.accept(1);

System.out.println("*********************************");

//使用lambda表达式之后

Consumer c2 = (Integer integer) -> System.out.println("使用消费者"+ integer);

c2.accept(2);

    }

//第三种 数据类型可以省略,因为可以有编译器推断得出,称为”类型推断“

@Test

publicvoidlambda03(){

Consumer c1 =newConsumer() {

@Override

publicvoidaccept(Integer integer){

System.out.println("使用消费者"+ integer);

            }

        };

c1.accept(1);

System.out.println("*********************************");

//使用lambda表达式之后

Consumer c2 = (integer) -> System.out.println("使用消费者"+ integer);

c2.accept(2);

    }

//第四种情况 如果参数只要一个的情况下,可以省略参数列表的小括号

@Test

publicvoidlambda04(){

Consumer c1 =newConsumer() {

@Override

publicvoidaccept(Integer integer){

System.out.println("使用消费者"+ integer);

            }

        };

c1.accept(1);

System.out.println("*********************************");

//使用lambda表达式之后

Consumer c2 = integer -> System.out.println("使用消费者"+ integer);

c2.accept(2);

    }

//第五种情况 需要两个或者以上参数,多条执行语句,并且有返回值

@Test

publicvoidlambda05(){

Comparator c1 =newComparator() {

@Override

publicintcompare(Integer o1, Integer o2){

                System.out.println(o1);

                System.out.println(o2);

returno1.compareTo(o2);

            }

        };

System.out.println(c1.compare(11,22));

System.out.println("*********************************");

//使用lambda表达式之后

        Comparator<Integer> c2 = (o1, o2) -> {

            System.out.println(o1);

            System.out.println(o2);

returno1.compareTo(o2);

        };

System.out.println(c2.compare(11,22));

    }

//第六种情况 当lambda体只有一条语句是,return和方法体的大括号都可以省略

@Test

publicvoidlambda06(){

Comparator c1 =newComparator() {

@Override

publicintcompare(Integer o1, Integer o2){

returno1.compareTo(o2);

            }

        };

System.out.println(c1.compare(11,22));

System.out.println("*********************************");

//使用lambda表达式之后

        Comparator<Integer> c2 = (o1, o2) -> o1.compareTo(o2);

System.out.println(c2.compare(11,22));

    }

总结:

      --> 左边: lambda形参列表的参数类型都可以省略(类型推断);如果lambda形参列表只有一个,()可以省略。

      --> 右边:lambda体应该使用{}包裹,如果lambda方法体如果只有一条语句,可以省略return和大括号(注意:要省略必须同时省略。)

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容