首页 > 其他分享 >Lambda表达式从入门到精通

Lambda表达式从入门到精通

时间:2024-11-03 13:45:06浏览次数:5  
标签:return 入门 int 参数 public 表达式 Lambda

Lambda表达式

一. 入门Lambda表达式

1.1 概述

  • Lambda表达式是JDK8中的一个语法糖, 他可以对某些匿名内部类的写法进行化简. 它是函数式编程思想的一个重要体现. 它的本质就是: 不关注是什么对象, 而是关注我们对数据进行了什么操作.

1.2 核心原则:

  • 参数类型的可推导 :

    • 在许多编程语言支持的 Lambda 表达式中,参数类型是可以被推导出来的。以 Java 为例,当使用 Lambda 表达式实现一个函数式接口时,编译器可以根据函数式接口中抽象方法的参数类型来推断 Lambda 表达式中参数的类型。
    • 这里编译器根据Function<Integer, Integer>接口的apply方法的参数类型知道x是Integer类型,不需要显式地写成(Integer x) -> x * x。这种参数类型的推导机制使得代码更加简洁,尤其是在参数类型比较明显的情况下。可以写成(x) -> x * x;的形式
  • 参数括号的可省略(在特定情况下)

    • 当 Lambda 表达式只有一个参数时,参数周围的括号可以省略。还是以 Java 为例,对于函数式接口Consumer(它有一个抽象方法accept,接受一个String参数且没有返回值),可以这样写 Lambda 表达式:
    • Consumer<String> printString = str -> System.out.println(str); 这里省略了参数str周围的括号。但是如果有多个参数,括号就不能省略,比如对于函数式接口BiFunction<Integer, Integer, Integer>(它有一个抽象方法apply,接受两个Integer参数并返回一个Integer),Lambda 表达式应该写成(x,y) -> x + y
  • 花括号和 return 关键字的省略(在特定情况下)

    • 当 Lambda 表达式的主体是一个简单的表达式(只包含一条语句),并且这条语句返回一个值时,花括号和return关键字可以省略。

1.3 基本格式:

  • (参数列表) -> { 代码 }
    • 参数列表: 用于接收输入值. 可以为空, 如( ) ->{ } 表示没有参数; 可以有一个参数,如(x)->{ },在某些情况下,当只有一个参数时,括号可以省略,写成x->{};也可以有多个参数,如(x,y)->{}
    • 箭头符号(->): 这是 Lambda 表达式的语法标志,用于分隔参数列表和表达式主体,清晰地表明参数的输入和表达式主体对这些参数的操作。
    • 表达式主体: 这是 Lambda 表达式的核心部分,它是对参数进行操作的代码。表达式主体可以是一个简单的表达式,如(x+y)->x+y,这种情况下,表达式的值就是 Lambda 表达式的返回值;也可以是一个代码块,用花括号{…}包裹,如(x,y)->{int z= x+y; return z},如果是代码块形式,需要使用语句来返回值(如果有返回值要求的话)

二. 使用Lambda表达式

例一

  • 使用匿名内部类的方式创建线程->转为Lambda表达式
  • 代码展示:
public class Demo {
    public static void main(String[] args) {
        // 使用匿名内部类创建线程
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("hello world");
            }
        });
        thread.start();
        // 使用lambda表达式创建线程
        Thread thread1 = new Thread(() -> System.out.println("hello world"));
    }
}
  • 转换规则: 只保留匿名内部类的参数部分()和要执行的代码逻辑System.out.println("hello world");

例二

  • 现有方法定义如下,其中IntBinaryOperator是一个接口。先使用匿名内部类的写法调用该方法。
  • 匿名内部类写法:
public static int calculateNum(IntBinaryOperator operator){
        int a = 10;
        int b = 20;
        return operator.applyAsInt(a, b);
    }

    public static void main(String[] args) {
        int i = calculateNum(new IntBinaryOperator() {
            @Override
            public int applyAsInt(int left, int right) {
                return left + right;
            }
        });
        System.out.println(i);
    }
  • Lambda表达式写法:
public static void main(String[] args) {
        int i = calculateNum((int left, int right)->{
            return left + right;
        });
        System.out.println(i);
    }
  • 转换规则: 只保留匿名内部类的参数部分(int left, int right) 和要执行的代码逻辑return left + right;

例三

  • 现有方法定义如下,其中IntPredicate是一个接口。先使用匿名内部类的写法调用该方法。
  • 匿名内部类写法:
public static void printNum(IntPredicate predicate){
        int[] arr = {1,2,3,4,5,6,7,8,9,10};
        for (int i : arr) {
            if(predicate.test(i)){
                System.out.println(i);
            }
        }
    }
    public static void main(String[] args) {
        printNum(new IntPredicate() {
            @Override
            public boolean test(int value) {
                return value%2==0;
            }
        });
    }
  • Lambda表达式写法:
public static void main(String[] args) {
        printNum((int value)-> {
            return value%2==0;
        });
    }
    public static void printNum(IntPredicate predicate){
        int[] arr = {1,2,3,4,5,6,7,8,9,10};
        for (int i : arr) {
            if(predicate.test(i)){
                System.out.println(i);
            }
        }
    }
  • 转换规则: 只保留匿名内部类的参数部分int value和要执行的代码逻辑return value%2==0

例四

  • 现有方法定义如下,其中Function是一个接口。先使用匿名内部类的写法调用该方法。
  • 匿名内部类写法:
public static <R> R typeConver(Function<String,R> function){
        String str = "1235";
        R result = function.apply(str);
        return result;
    }
    public static void main(String[] args) {
        Integer result = typeConver(new Function<String, Integer>() {
            @Override
            public Integer apply(String s) {
                return Integer.valueOf(s);
            }
        });
        System.out.println(result);
    }
  • Lambda表达式写法:
		Integer result = typeConver((String s)->{
            return Integer.valueOf(s);
        });
        System.out.println(result);
  • 转换规则: 只保留匿名内部类的参数部分String s和要执行的代码逻辑return Integer.valueOf(s);

例五

  • 现有方法定义如下,其中IntConsumer是一个接口。先使用匿名内部类的写法调用该方法。
  • 匿名内部类写法:
public static void foreachArr(IntConsumer consumer){
        int[] arr = {1,2,3,4,5,6,7,8,9,10};
        for (int i : arr) {
            consumer.accept(i);
        }
    }
    public static void main(String[] args) {
        foreachArr(new IntConsumer() {
            @Override
            public void accept(int value) {
                System.out.println(value);
            }
        });
    }
  • Lambda表达式写法:
public static void main(String[] args) {
        foreachArr((int value)->{
            System.out.println(value);
        });
    }
  • 转换规则: 只保留匿名内部类的参数部分(int value) 和要执行的代码逻辑System.out.println(value);

三.总结

  • Lambda表达式如何书写: 只保留匿名内部类的参数部分->要执行的代码逻辑.
  • Lambda表达式的省略规则:
    • 参数类型可以省略
    • 方法体只有一句代码时大括号return和唯一一句代码的分号可以省略
    • 方法只有一个参数时小括号可以省略
    • 以上这些规则都记不住也可以省略不记

标签:return,入门,int,参数,public,表达式,Lambda
From: https://blog.csdn.net/m0_74105656/article/details/143461055

相关文章

  • 书生大模型实训营第4期—入门岛第4关:玩转HF/魔搭/魔乐社区
    书生大模型实训营第4期—入门岛第4关:玩转HF/魔搭/魔乐社区任务一:模型下载1.使用HuggingFace平台下载模型1.1HuggingFace平台1.2InternLM模型下载1.3GitHubCodeSpace的使用1.3.1下载internlm2_5-7b-chat的配置文件1.3.2下载internlm2_5-chat-1_8b并打印示例输出......
  • Ubuntu零基础入门到精通【4.4讲】:️ 用户和权限管理
    目录:......
  • Ubuntu零基础入门到精通【4.3讲】:️存储设备与分区管理
    目录:......
  • 【算法-选择排序】挑挑拣拣,排出顺序——选择排序入门
    什么是选择排序?选择排序是一种比较简单直接的排序方式。想象你在打散一副牌,想按照大小顺序从小到大排列这些牌。你会怎么做?可能会先找出最小的那张,放在最前面,然后在剩下的牌里找第二小的,依次类推,这就是选择排序的基本思路!在程序中,选择排序的操作流程也类似:它逐步将未排序......
  • 编程小白如何成为大神?大学新生的最佳入门攻略
    编程小白如何成为大神?大学新生的最佳入门攻略编程已成为当代大学生的必备技能,但面对众多编程语言和学习资源,新生们常常感到迷茫。如何选择适合自己的编程语言?如何制定有效的学习计划?如何避免常见的学习陷阱?让我们一起探讨大学新生入门编程的最佳路径,为你的大学生活和未来职......
  • Kaggle入门指南(Kaggle竞赛)
    https://www.kaggle.com/文章目录Kaggle入门指南1.Kaggle的功能概述1.1竞赛1.2数据集1.3学习与教程1.4社区2.注册与设置2.1创建账户2.2完善个人资料3.探索数据集3.1查找数据集3.2下载数据集示例代码:加载数据集3.3数据预处理示例代码:数据预处理4.参......
  • 入门/粗略版开发流程
    开发流程Q:如果我要我的团队开发一个web翻译系统,集成了大语言模型和OCR技术,前端用html,js在vscode分别开发前台用户使用的系统和后台管理的系统,不使用框架;后端在golang开发,使用fetchapi,mongoDB数据库。写完代码后,前端使用vite构建静态文件,后端使用docker生成镜像文件,然后都放在......
  • Java学习教程,从入门到精通,Java 循环结构:while 和 do...while(17)
    Java循环结构:while和do…while在Java中,while和do...while是两种基本的循环控制结构,用于在特定条件下重复执行一段代码。1.while循环语法:while(condition){//循环体}知识点:condition是一个布尔表达式。在每次循环开始前,都会检查condition是否为......
  • 【网络安全入门】学习网络安全必须知道的100 个网络基础知识
    什么是链接?链接是指两个设备之间的连接。它包括用于一个设备能够与另一个设备通信的电缆类型和协议。2OSI参考模型的层次是什么?有7个OSI层:物理层,数据链路层,网络层,传输层,会话层,表示层和应用层。3什么是骨干网?骨干网络是集中的基础设施,旨在将不同的路由和数据......
  • Python numpy 入门系列 21 文件
    Pythonnumpy入门系列21文件 1NumPy数组的二进制存取NumPy提供了专门的函数save()和load(),用来保存和读取NumPy数组的二进制文件。这种方式高效且适合大规模数据的存储。1.1保存数组为二进制文件save()函数将NumPy数组保存为.npy格式的文件。该格式存储的是......