首页 > 其他分享 >Lambda表达式概述

Lambda表达式概述

时间:2024-10-19 16:31:43浏览次数:7  
标签:info name String 概述 public 表达式 Lambda

Lambda表达式

1、Lambada表达式概述

Lambda 是一个匿名函数,我们可以把Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。
写Lambda表达式的场景:
1. 能够使用 Lambda 表达式的一个重要依据是必须有相应的函数接口。所谓函数接口,是指内部有且仅有一个抽象方法的接口。
2. Lambda 表达式的另一个依据是类型推断机制。在上下文信息足够的情况下,编译器可以推断出参数列表的类型,而不需要显式指名。

2、Lambada基本语法

<1>Lambda表达式基本语法:
    Lambda 表达式在Java 语言中引入了一个新的语法元素和操作符。这个操作符为->,该操作符被称为Lambda 操作符或箭头操作符。
它将Lambda 分为两个部分:
左侧:指定了Lambda 表达式需要的所有参数(对应接口中形参)
右侧:指定了Lambda 体,即Lambda 表达式要执行的功能。(方法体,可以推断返回值类型)

<2>Lambda表达式根据使用方式分为6类:
1. 无参数,无返回值
2. 有一个参数,无返回值
3. 若只有一个参数,小括号可以省略不写
4. 有两个以上的参数,有返回值,并且 Lambda 体中有多条语句
5. 若 Lambda 体中只有一条语句, return 和 大括号都可以省略不写
6. Lambda 表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出,数据类型,即“类型推断”

格式1:无参数,无返回值
    
基本语句格式
() -> {
    执行语句
}
    
格式2:有一个参数,无返回值
    
基本语句格式
(变量名) -> {
    执行语句
}

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

基本语句格式
变量名 -> {
    执行语句
}

格式4:有两个以上的参数,有返回值,并且 Lambda 体中有多条语句
    
基本语句格式
(变量名1, 变量名2) -> {
    执行语句;
return xxx;
}

格式5:若 Lambda 体中只有一条语句, return 和 大括号都可以省略不写
    
基本语句格式
(变量名1, 变量名2) -> 要返回的结果;

格式6:类型推断(一般不这样使用)
    
基本语句格式
([类型] 变量名1, [类型] 变量名2) -> 要返回的结果;

3、Java内置函数接口

Predicate<T> 断言型接口

接口类型:
@FunctionalInterface
public interface Predicate<T> {
    boolean test(T t);
}   

Function<T,R> 函数型接口

接口类型:
@FunctionalInterface
public interface Function<T, R> {
    R apply(T t);
}    
    
Supplier<T> 供给型接口    
    
接口类型:
@FunctionalInterface
public interface Supplier<T> {
    T get();
}

Consumer<T> 消费型接口
接口类型:

@FunctionalInterface
public interface Consumer<T> {
    void accept(T t);
}        

4、Lambda用法再简洁之方法引用

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

假如 Lambda 表达式符合如下格式:
([变量1, 变量2, ...]) -> 对象引用.方法名([变量1, 变量2, ...])
我们可以简写成如下格式:
对象引用::方法名
    
2、类 :: 静态方法名
    当我们要执行的表达式是调用某个类的静态方法,并且这个静态方法的参数列表和接口里抽象函数的参数列表一一对应时,我们可以采用引用静态方法的格式。

假如 Lambda 表达式符合如下格式:
([变量1, 变量2, ...]) -> 类名.静态方法名([变量1, 变量2, ...])
我们可以简写成如下格式:
类名::静态方法名
注意这里静态方法名后面不需要加括号,也不用加参数,因为编译器都可以推断出来。

3、类 :: 实例方法名
    假如我们的 Lambda 表达式符合如下格式:
(变量1[, 变量2, ...]) -> 变量1.实例方法([变量2, ...])
那么我们的代码就可以简写成:
变量1对应的类名::实例方法名

若Lambda 的参数列表的第一个参数,是实例方法的调用者,第二个参数(或无参)是实例方法的参数时,格式: ClassName::MethodName

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

假如我们的 Lambda 表达式符合如下格式:
([变量1, 变量2, ...]) -> new 类名([变量1, 变量2, ...])
我们就可以简写成如下格式:
类名::new

        Function<String, Employee> fun = Employee::new;
        System.out.println(fun.apply("xiaohu"));

5、数组引用
    假如我们的 Lambda 表达式符合如下格式:
(变量) -> new 元素类型[变量]
我们就可以简写成如下格式:
元素类型[] :: new
    
6、误区:Lambda 表达式底层Lambda 表达式被封装成了主类的一个私有方法,并通过 invokedynamic 指令进行调用,并且书写 Lambda 表达式不会产生新的类。所以不能单纯的理解Lambda表达式和匿名内部类的实现原理是一样的,但是可以理解为简化匿名内部类的写法。

7、小结:

优点:
可以减少代码的书写,减少匿名内部类的创建,节省内存占用。
使用时不用去记忆所使用的接口和抽象函数。

缺点:
易读性较差,阅读代码的人需要熟悉 Lambda 表达式和抽象函数中参数的类型。
不方便进行调试。

5、新特性:枚举

JDK1.5之前使用枚举

/*
    1. 创建枚举类的属性(成员遍历),必须是作为私有常量出现
    2. 必须将构造方法私有化,这是为了保证类的对象是有限个的目的
    3. 提供公共的静态的final方法给外界获取枚举类中多个对象
    4. 提供公共的获取属性的方法
    5. 重写toString()方法

 */
class Season{
    //1. 创建枚举类的属性(成员遍历),必须是作为私有常量出现
    private String name;
    private String info;

    //2. 必须将构造方法私有化,这是为了保证类的对象是有限个的目的
    private Season(String name, String info){
        this.name = name;
        this.info = info;
    }

    //3. 提供公共的静态的final方法给外界获取枚举类中多个对象
    public static final Season SPRING = new Season("春天","春暖花开");
    public static final Season SUMMER = new Season("夏天","烈日炎炎");
    public static final Season AUTUMN = new Season("秋天","秋高气爽");
    public static final Season WINTER = new Season("冬天","白雪皑皑");

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


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }

    @Override
    public String toString() {
        return "Season{" +
                "name='" + name + '\'' +
                ", info='" + info + '\'' +
                '}';
    }
}

public class SeasonDemo1 {
    public static void main(String[] args) {
        Season spring = Season.SPRING;
        Season summer = Season.SUMMER;

    }
}


JDK1.5之后使用枚举
/*
    jdk1.5之后 java提供了一个关键字用于创建枚举类 enum
 */
enum Season2{
    //jdk1.5之后必须将有限个对象放在enum枚举类第一个开头位置,多个对象之间使用逗号隔开
    SPRING("春天","春暖花开"),
    SUMMER("夏天","烈日炎炎"),
    AUTUMN("秋天","秋高气爽"),
    WINTER("冬天","白雪皑皑");

    //1. 创建枚举类的属性(成员遍历),必须是作为私有常量出现
    private String name;
    private String info;

    //2. 必须将构造方法私有化,这是为了保证类的对象是有限个的目的
    private Season2(String name, String info){
        this.name = name;
        this.info = info;
    }

    //4. 提供公共的获取属性的方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }

    @Override
    public String toString() {
        return "Season{" +
                "name='" + name + '\'' +
                ", info='" + info + '\'' +
                '}';
    }
}

public class SeasonDemo2 {
    public static void main(String[] args) {
        Season2 spring = Season2.SPRING;
        System.out.println(spring.getName());
        System.out.println(spring.getInfo());
    }
}


标签:info,name,String,概述,public,表达式,Lambda
From: https://www.cnblogs.com/snzjz/p/18475049

相关文章

  • OCR 详细学习技术概述 OCR 技术原理
    一、章节目录OCR概述OCR技术原理OCR应用领域学习OCR技术的方法OCR技术的发展趋势二、各章节知识点总结OCR概述OCR(OpticalCharacterRecognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别......
  • MATLAB 工具箱详细重点知识点概述 MATLAB 工具箱使用案例
    一、章节目录MATLAB工具箱概述常见MATLAB工具箱介绍MATLAB工具箱使用案例展示学习MATLAB工具箱的方法MATLAB工具箱的发展趋势二、各章节知识点总结MATLAB工具箱概述MATLAB是一种广泛应用于科学计算、数据分析、算法开发等领域的高级编程语言和交互式环境。MA......
  • [Mybatis Plus]lambdaQueryWrapper和QueryWrapper的选择
    结论更推荐使用:LambdaQueryWrapperQueryWrapper:灵活但是不够类型安全LambdaQueryWrapper:安全分析在MyBatis-Plus中,QueryWrapper和LambdaQueryWrapper都是用来构建查询条件的工具类。它们都提供了链式调用的方式来构造SQL语句中的WHERE条件部分,但是两者之间存在一些差异。......
  • UI开发概述
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(MaoistLearning)➤博客园地址:为敢技术(https://www.cnblogs.com/strengthen/ )➤GitHub地址:https://github.com/strengthen➤原文地址:https://www.cnblogs.com/strengthen/p/......
  • lambda表达式之jvm提供的接口
    一、java内置函数式接口:断言式接口importjava.util.ArrayList;importjava.util.Arrays;importjava.util.List;importjava.util.function.Predicate;/*java内置函数式接口:断言式接口只有函数式接口【有且仅有一个抽象方法】才可以被@FunctionalInterface注解所......
  • lambda表达式的写法2
    一、类名::静态方法名publicclassStaff{privateStringid;privateStringname;privateintage;privateintsalary;publicStaff(){}publicStaff(Stringid,Stringname,intage,intsalary){this.id=id;t......
  • lambda表达式的写法1
    一、lambda表达式的含义Lambda表达式是Java8引入的一种简洁的语法,用于表示匿名函数或传递行为。它使得我们可以更简洁地表达代码中的行为和函数逻辑,特别是在使用函数式接口时(如Consumer、Supplier、Function<T,R>等)。Lambda表达式可以大大简化代码,尤其是当我们需要为接口......
  • js实现cron表达式翻译成中文
    js实现cron表达式翻译成中文参考项目https://github.com/ikesnowy/cron-chinese对他的代码进行改进:只能翻译分时日月周和这五个符号:*?-/,exportfunctionhumanizeCronInChinese(cron){consttokens=cron.trim().split('');constcronStruc......
  • 八,Lambda表达式
    JavaLambda表达式与枚举Lambda表达式概述Java从JDK1.8开始引入了Lambda表达式,以简化代码开发并支持函数式编程。Lambda表达式可以避免面向对象编程中的一些繁琐问题,但同时也是一把双刃剑。Lambda表达式的使用场景必须有相应的函数接口,即内部有且仅有一个抽象方法的接口。......
  • 模板信息渲染和正则表达式的运用
    业务后台配置模板消息配置变量名及相关数据,用来进行查询配置模板信息,嵌入变量名前台渲染通过接口获取模板信息将模板消息中的变量替换成对应的数据模板信息:'今天到场一共${aaa}人,其中男${bbb}人,女${ccc}人'相关信息:{describe:'今天到场一共${aaa}人,其中男${bbb......