首页 > 编程语言 >Java——lambda表达式

Java——lambda表达式

时间:2023-11-29 20:12:56浏览次数:31  
标签:Java 函数 接口 格式 lambda 表达式 变量

一、概述

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

  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()方法

 

 

标签:Java,函数,接口,格式,lambda,表达式,变量
From: https://www.cnblogs.com/black-rosebush/p/17865334.html

相关文章

  • java集合框架(三)ArrayList的常见使用
    1、ArrayList简介在集合框架中,ArrayList是一个类,实现了List接口:1.ArrayList是以泛型的方式实现的,使用时必须先实例化2.ArrayList实现了randomAccess接口,所以ArrayList支持随机访问3.ArrayList实现了cloneable接口,ArrayList时可以克隆的4.ArrayList不是线程安全的,(Vector是线程......
  • Java系列---【时间格式合法性校验】
    #不能用LocalDate.parse(),解析不了20230231,默认会解析成20230228,并且不抛异常,用Strict模式,虽然会抛异常但无法解析20230201,推荐下面的publicstaticbooleanisValidDateFormat(Stringdate,Stringformat){if(date.length!=format.length){returnfalse;}......
  • java 令牌解析_SpringSecurity 原理解析【4】:令牌还原与Session String changeSessio
    java令牌解析_SpringSecurity原理解析【4】:令牌还原与SessionStringchangeSessionId();//修改SessionIdSpringSecurity原理解析【4】:令牌还原与SessionSession:一般称为会话,不同环境中含义不同,在SpringSecurity中一个会话指:客户端从令牌认证请求到登出注销请求之间的......
  • java基础学习:random随机数,random案例
    1.Random使用步骤:  packagecom.itheima.Random;importjava.util.Random;publicclassRandom1{publicstaticvoidmain(String[]args){Randomrandom=newRandom();for(inti=1;i<=10;i++){intdata=random.nextInt(1......
  • JAVA的swap实现
    JAVA的swap实现JAVA不能操作地址,所以不能像CPP那样方便地实现对基本数据类型的swap。java中的基本数据类型传递属于引用传递,并不会像c/c++实现指针传递;通过包装类对象配合反射可以实现数据的交换。只能通过以下几种方式。通过数组对象交换publicclassTestSwap{ publi......
  • Java 8 仍被广泛使用,占比 50%
    调查中,更多的开发人员选择在生产中使用Java17,而不是Java11。Docker逐渐成为打包Web应用程序的首选,且Spring和SpringBoot的使用率遥遥领先。具体而言,开发者最常使用的 Java版本是 Java8,占比高达 50%;其次分别是 Java17(45%)、Java11(38%)以及 Java20(11%......
  • 学习笔记1 :Java基础
    1、JVM(1)Java虚拟机:是运行所有Java程序的抽象计算机,是Java语言的运行环境。(2)JVM包括:一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域(3)跨平台:JVM在执行字节码时,把字节码解释成具体平台上的机器指令执行。一套代码,一次编译,多平台运行。但是,不同平台需要不......
  • java基础学习:跳转关键字:break,continue
    1.总览:break:跳出并结束当前所在循环的执行continue:用于跳出当前循环的当次执行,直接进入循环的下一次执行 packagecom.itheima.BreakAndContinue;publicclassBreakAndContine1{publicstaticvoidmain(String[]args){for(inti=1;i<=5;i++){......
  • java基础学习:死循环,循环嵌套
    1.死循环:写法 packagecom.itheima.loop;publicclassEndLessLoop{publicstaticvoidmain(String[]args){//掌握死循环写法//for(;;){//System.out.println("ss");//}//while(true){//System......
  • Java集合框架之:LinkedList的常见方法使用
    ✨前言✨本篇文章主要介绍JavaLinkedList的使用方法教程及示例代码......