Java——lambda表达式

发布时间 2023-11-29 20:10:58作者: 在这么冷的天

一、概述

  简化代码开发,可以实现函数式的编程。利用函数式的编程可以避免面向对象过程中一些的繁琐的问题

  lambda是一把双刃剑

二、使用场景

  1.能够使用lambda表达式的一个重要依据是必须有相应的函数接口。所谓函数接口,是指内部有且仅有一个抽象方法的接口。

  2.lambda表达式的另一个依据是类型推断机制。在上下文信息足够的情况下,编译器可以推断出参数列表的类型,而不需要显示指名。

三、优点

  lambda是一个匿名函数,我们可以把lambda表达式里理解为一段可以传递的代码。可以写出更简洁,更灵活的代码

四、基本语法

  lambda表达式在java语言中引入了一个新的语法元素和操作符。这个操作符为->,该操作符被称为lambda操作符或箭头操作符。

  它将lambda分为两个部分:

    左侧:指定了lambda表达式需要的所有参数(对应接口中形参)

    右侧:指定了lambda体,即lambda表达式要执行的功能。(方法体,可以推断返回值类型)

五、lambda根据使用方式分类:

  无参数,无返回值

    基本语句格式

      ()->{

       执行语句  

      }

  有一个参数,无返回值                              

    基本语句格式

      (变量名)->{

        执行语句

        }

  若只有一个参数,小括号可以省略不写

    基本语句格式

      变量名->{

        执行语句

        }

   如果接口中的方法有返回值类型,写lambda表达式的时候,如果只有一条语句的时候不需要写return,多条语句的时候需要

  有参有返回值

  有两个参数,一个返回值

    基本语句格式  

      (变量名1,变量名2)->{

        执行语句;

        return xxx;

        }

 

  若lambda体中只有一条语句,return和大括号都可以省略不写

    基本语句格式

      (变量名1,变量名2)-> 要返回的结果;

六、函数式接口

  只包含一个抽象方法的接口 ,成为函数式接口

  可以通过lambda表达式来创建该接口的对象(若lambda表达式抛出一个受检异常,那么该异常需要在目标接口的抽象方法上进行声明)

  在任意函数式接口上设置@FunctionalInterface注解,这样做可以检查它是否是一个函数式接口

 

  无参无返回值  viod test()

  有参无返回值  void test(T t)

  无参有返回值  R test()

  有参有返回值  R test(T t)

 

使用java内置的函数式接口实现员工过滤的案例

  interface Predicate<T>{

    boolean test(T t);  

  }

使用java内置函数式接口Function<T,R>

     Function<T,R>{

    R apply(T t);

  }

使用java内置函数式接口Supplier

  public interface Supperlier<T>{

    T get();

  }

使用函数内置式接口Consumer

  @FunctionnalInterface  

  piblic interface Consumer<T>{

    void accept(T,t);

  }

七、再简洁之方法引用

  当我们要执行的表达式是调用某个对象的方法,并且这个方法的参数列表和接口里抽象函数的参数列表一一对应时,我们就可以采用引用对象的方法的格式。

  lambda表达式符合如下格式:

    ([变量1,变量2,...])-> 对象引用,方法名([变量1,变量2,...])

  简写如下

    对象引用::方法名

  

当我们执行的表达式是调用某个类的静态方法,并且这个静态方法的参数列表和接口里抽象函数的参数列表一一对应时,我们可以采用引用静态方法的格式

表达式符合如下格式:

  ([变量1,变量2,...])-> 类名.方法名([变量1,变量2,...])

简写如下:

  类名::静态方法名

 

当lambda参数列表的第一个参数是实例方法的调用者,第二个参数(或无参)是实例方法的参数时

当执行的表达式符合如下格式:

  (变量1[,变量2,...])-> 变量1.实例方法(变量2,...])

简写如下:

  变量1对应的类名::实例方法名

 

当我们要执行的表达式是新建一个对象,并且这个对象的构造方法的参数列表和接口里的函数的参数列表一一对应时,我们就可以采用“引用构造方法”的格式

如果我们的lambda表达式符合如下格式:

  ([变量1,变量2,...])-> new 类名([变量1,变量2,...])

可以简写如下格式:

  类名::new

 

如果我们的lambda表达式符合如下格式:

  (变量)->new 元素变量[变量]

可以简写如下格式:

  元素类型[]::new 

  

  @FunctionalInterface

  public interface Function<T,R>{

    R apply(T,t);

  }

八、总结

  优点

    可以减少代码的书写,减少匿名内部类的创建,节省内存占用

    使用时不用去记忆所使用的接口和抽象函数

  缺点

    易读性较差,阅读代码的的人需要熟悉lambda表达式和抽象函数中的参数类型

    不方便进行调试

九、枚举

  概述

    枚举类型是Java中一种用于统一管理有限的常量数据的数据类型。它将常量设置为对象,提高了代码的可读性和间接性。

    通过使用枚举类型,可以在代码中更方便的读取和使用常量。

  JDK1.5之前使用枚举

    1.创建枚举类的属性(成员遍历),必须是作为私用常量出现

    2.必须将构造方法私有化,这是为了保证类的对象是有限个的目的

    3.提供公共的静态的final方法给外界获取枚举类中多个对象

    4.提取公共的获取属性的方法

    5.重写toString()方法

  JDK1.5之后使用枚举

      1.将枚举的相关的对象放在开头

      2.创建枚举类的属性(成员遍历),必须是作为私有常量出现  

      3.必须将构造方法私有化,这是为了保证类的对象是有限个的目的

      4.提供公共的获取属性的方法

      5.重写toString()方法