JDK1.8新特性——lambda表达式

1 lambda表达式概述

(1)lambda表达式是jdk1.8出来的一个重量级的改进,在使用接口实现类进行参数传递局部变量赋值时,可用通过lambda表达式替换接口(只有一个抽象方法)的实现类,简化代码的编写,减少类的个数。

(2)lambda表达式作用

         java是一种面向对象的语言,所以方法是不能独立存在的,必须被类所包含;这样会造成一个问题,就是在使用接口作为参数传递的时候,使用者的目的是为了使用接口中的方法,但是却必须创建接口的实现类,将实现类当做参数进行传递,使代码编写变得复杂,lambda表达式则突破这个局限性,可以直接将方法当成参数传递;但是使用lambda表达式替换接口的局限性是接口中只能有一个抽象方法。

2 lambda表达式使用

(1)lambda表达式的格式:(参数1,参数2,...)->{代码...}(由参数和方法体组成,类似没有方法名的方法)

//对数组的排序,使用lambda表达式传递外部比较器方法
Arrays.sort(array, (Person a, Person b) ‐> {
    //lambda表达式的代码
    return a.getAge() ‐ b.getAge();
});
/******************************************************************/
//对比:不使用lambda表达式的写法
// 外部比较器接口实现
Comparator<Person> comp = new Comparator<Person>() {
    @Override
    public int compare(Person o1, Person o2) {
    return o1.getAge() ‐ o2.getAge();
    }
};
//比较器接口实现类作为参数传递
Arrays.sort(array, comp); // 第二个参数为排序规则,即Comparator接口实例

(2)lambda表达式的简化

        1)当小括号中的参数类型可以省略

        2)小括号中的参数只有一个的时候,可以省略小括号

        3)大括号中的代码部分只有一个语句的时候,可以省略返回值,大括号,封号(注意:要省略必须同时省略)

//未省略写法
Arrays.sort(array, (Person a, Person b) ‐> {
    return a.getAge() ‐ b.getAge();
});
//省略写法
Arrays.sort(array, (a, b) ‐> a.getAge() ‐ b.getAge());

 3 lambda表达式的使用条件

(1)lambda表达式只能用来替换接口的实现类,并且接口中只能有一个抽象方法;

(2)lambda必须有上下文推断:作为方法参数和传递给局部变量,必须有lambda所替换的接口对应的类型。

4 函数式接口

(1)函数式接口:只有一个抽象方法的接口;使用函数式接口作为参数或其实现类传递给某个引用时,可以使用lambda表达式进行代替,以简化写法,提高效率;函数式接口使用@FunctionInterface注解进行修饰,保证接口在定义时只有一个抽象方法。

(2)常用函数式接口

         JDK中提供了丰富的函数式接口,用来丰富Lambda表达式的使用场景,在java.util.function包中被提供

      1)Supplier接口

           提供了一个 T get()抽象方法,该接口的作用是用来产生所指定泛型的对象数据,例如要产生一个带有5个0-100随机数的ArrayList集合,可以使用该方法来产生;

      2)Consumer接口

          1)提供了一个void accept(T) 用来消费一个数据,例如传入一个数据,将其以不同的形式打印在控制台;

          2)提供了andThen方法,用来将两个Consumer对象级联起来执行,例如one.andThen(two).accept("Hello");就是先执行one的accept方法,再执行two的accept方法

      3)Predicate接口

          1)提供了boolean test(T t)用来对某种数据类型机型判断,返回boolean值,例如判断一个字符串中是否包含某个子串,字符串中的内容是否符合一些指定的规则;

          2)提供了三个默认方法  and  or  negate 

               1)and方法,将两个Predicate接口的执行结果进行与逻辑后输出结果,例如

                    boolean isValid = one.and(two).test("Helloworld");one和two的test方法结果与运算后输出结果

               2)or方法,将两个Predicate接口的执行结果进行或逻辑后出处结果;

               3)negate方法:将Predicate接口的执行结果进行取反后输出结果;

       4)Function接口
             1)提供apply()方法,进行类型的转换,例如将一个整型转换为字符串类型;

             2)andThen():将两个接口进行级联执行,先进行第一次转换,将第一个转换结果作为第二个转换的参数进行转换;

                例如int num = one.andThen(two).apply("10");先执行one结果的方法,使用参数“10”,然后将结果作为two接口的参数进行转换;

                 

           

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值