Java8新特性:Lambda表达式和函数式接口

た 入场券 2022-04-22 10:24 323阅读 0赞
Java8新特性:速度更快,代码更少,stream API,便于并行,最大化减少空指针异常:Optional

Lambda表达式

好处

Lambda是一个匿名函数,可以把lambda表达式理解为一段可以传递的代码,写出更简洁,更灵活的代码,使得Java语言表达能力得到提高

  1. Lambda表达式只能为函数式接口的形参,变量赋值(SAM
  2. public class TestLambda1 {
  3. public static void main(String[] args) {
  4. //需要override run()方法
  5. new Thread(){
  6. public void run(){
  7. print();
  8. }
  9. }.start();
  10. //用thread()启动runnable()
  11. new Thread(new Runnable() {
  12. public void run() {
  13. print();
  14. }
  15. }).start();
  16. //匿名函数 lambda表达式,减少了代码量
  17. new Thread(() -> print()).start();
  18. }
  19. private static void print(){
  20. for(int i=0; i<=9; ++i){
  21. System.out.println(i);
  22. }
  23. }
  24. }

函数式接口

具有SAM特性的接口(Single abstract method):

  1. 使得以这种类型的接口为参数时,可以使用Lambda表达式为参数,底层可以进行解析,不影响功能,减少代码量
  2. 函数式接口必定使用@FunctionalInterface进行修饰
    注解: @FunctionalInterface
    SAM原则的两个意外情况:

    • 抽象类的默认方法和静态方法并不影响函数式接口的契约,可以随意使用
    • 可以有Object重写的方法,toString() hashcode(),equals()方法

Java四大核心函数式接口









































名称 函数式 参数类型 返回值 用途
消费型接口 Consumer< T > T void
供给型接口 Supplier< T >
断定型接口 Predicate< T >
函数型接口 Function<T,R>

Lambda基本语法

在这里插入图片描述
格式:

  • 无参无返回值:

    形式:() ->{Lambda 体}
    说明: 如果Lambda体只有一句,那么{ ;}可以省略

  • 无参有返回值:

    ()->{Lambda体}
    说明:如果Lambda体只有一个语句,那么{return;}可以省略
    如果{}没有省略,那么return也不可以省略
    ()不可以省略

  • 有参无返回值:

    消费型:
    (形参列表)->{Lambda体}
    说明:如果Lambda体只有一个语句,那么{;}可以省略
    如果他的形参类型是确定的,或是可以推断的,形参类型可以省略
    如果形参列表只有一个,那么形参和()都可以省略

  • 有参有返回值:

    (形参列表)->{Lambda体}
    说明:如果Lambda体只有一个语句,{return ; }可以省略
    如果形参的类型是确定的,或者是可以推断的,那么形参的类型可以省略
    如果他的形参只有一个形参,那么()和数据类型都可以省略
    形参名不可以省略,但是形参名可以和接口的抽象方法的形参名不一样

四大类核心的函数式接口:
  1. 1.消费型接口:
  2. 抽象方法有参数无返回值
  3. Interface Consumer<T>:void accept(T t)
  4. 2.供给型:
  5. 抽象方法:有返回值无参
  6. Interface Supplier<T>: T get()
  7. 3.功能性:
  8. 抽象方法:有参有返回值
  9. Interface Function<T,R>
  10. R apply<T t>
  11. 4.判断型:
  12. 抽象方法:返回值是boolean
  13. Interface Predicate<T>: boolean test(T t)
JDK1.8中的optional

背景 到目前为止,臭名昭著的空指针异常是导致Java应用程序失败的最常见原因。以前,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的代码。受到Google Guava的启发,Optional类已经成为Java 8类库的一部分。
Optional类是一个容器类,代表一个值存在还是不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且可以避免空指针异常。

常用方法:
  • Optional.of(T t):创建一个optional对象实例,t不能为null
  • Optional.empty():创建一个空的optional实例对象
  • Optional.ofNullable(T t):t可以为null,若不为null创建实例,否则创建optional空实例
  • isPresent()是否包含值
  • T get():如果调用对象包含值,则返回,否则抛出异常
  • orElse(): 有值返回,否则返回指定值
  • orElseGet():与orElse()类似,区别在于得到的默认值,orElseGe()通过Supplier的接口的默认实现生成返回值
  • orElseThrow():如果有值则将其返回,否则抛出supplier接口创建的异常

发表评论

表情:
评论列表 (有 0 条评论,323人围观)

还没有评论,来说两句吧...

相关阅读