JDK1.8新特性---------lambda

2023-11-17

1. Lambda表达式

1.1 概念

  • Lambda表达式: 特殊的匿名内部类,语法更加简洁 .是JDK1.8中的新特性.
  • Lambda表达式允许把函数作为一个方法的参数(函数作为方法参数传递),将代码像数据一样传递.

1.2 需求

1、开启一个线程。并执行一个Runnable类型的任务。

public class Test01 {
    public static void main(String[] args) {
        //匿名内部类
        Runnable tast1=new Runnable() {
            public void run() {
                System.out.println("这是使用匿名内部类"+Thread.currentThread().getName());
            }
        };
        new Thread(tast1).start();

        System.out.println("主线程的内容:"+Thread.currentThread().getName());
    }
}
  1. Thread类需要一个Runnable接口作为参数,其中的抽象方法run方法是用来指定线程任务内容的核心
  2. 为了指定run方法体,不得不需要Runnable的实现类
  3. 为了省去定义一个Runnable 的实现类,不得不使用匿名内部类
  4. 必须覆盖重写抽象的run方法,所有的方法名称,方法参数,方法返回值不得不都重写一遍,而且不能出错,
  5. 而实际上,我们只在乎方法体中的代码.不会在意方法名.

1.3 lambda的语法

lambda表达式它由三部分组成

(数据类型 变量名,数据类型 变量名)->{方法体}

格式说明:

  • (参数类型 参数名称):参数列表
  • {代码体;} :方法体
  • -> : 箭头,分割参数列表和方法体

1. 4Lambda练习

练习无参无返回值的Lambda

public class Test02 {
    public static void goShow(UserService userService){
         userService.show();
    }

    public static void main(String[] args) {
        //1.自己创建一个UserService接口的实现类。并创建该类的对象。
        UserService userService=new UserServiceImpl();
        goShow(userService);
        //2.使用匿名内部类
        UserService userService1=new UserService() {
            @Override
            public void show() {
                System.out.println("这是UserService的匿名实现类");
            }
        };
        goShow(userService1);

        //3.使用lambda表达式
        UserService userService2=()->{
            System.out.println("这是lambda表达式");
        };
        goShow(userService2);
    }
}
interface UserService{
     public void show();
}
class UserServiceImpl implements UserService{

    @Override
    public void show() {
        System.out.println("这是UserService实现方法");
    }
}

1.5 Lambda练习2

完成一个有参且有返回值得Lambda表达式案例.

创建一个People对象

@Data
@NoArgsConstructor
@AllArgsConstructor
class People{
     private String name;
     private int age;
}

测试:

public class Test03 {
     public static void main(String[] args) {
          List<People> list=new ArrayList<People>();
        students.add(new Student("张三",34));
        students.add(new Student("李四",45));
        students.add(new Student("王五",25));
        students.add(new Student("糖糖",35));

          //按照年龄进行排序。第二个参数需要传递排序规则
//          Comparator<People> comparator=new Comparator<People>() {
//               public int compare(People o1, People o2) {
//                    return o1.getAge()-o2.getAge();
//               }
//          };
//          Collections.sort(list,comparator);
//          System.out.println(list);

          System.out.println("=============================================");
          Comparator<People> comparator1=(People o1,People o2)->{return o2.getAge()-o1.getAge();};
          Collections.sort(list,comparator1);
          System.out.println(list);
     }
}

1.6 lambda表达式的缩写版

在lambda表达式的标准写法基础上,可以使用省略写法的规则为:

  1. 小括号内的参数类型可以省略
  2. 如果小括号内有且仅有一个参数,则小括号可以省略
  3. 如果大括号内有且仅有一个语句,可以同时省略大括号,return 关键字及语句分号。
package com.ykq.jdk.lambda03;


public class Test03 {
    public static void main(String[] args) {
//        UserService userService=(String name,int age)->{return name+"~~~~~"+age;};
        UserService userService=(name, age)-> name+"~~~~~"+age       ;//可以省略lambda表达式参数的类型,以及{}和return 和分号;
        goUserService(userService);

//        StudentService studentService=(name)->{ System.out.println("我叫:"+name);};
//        StudentService studentService= name->{ System.out.println("我叫:"+name);}; //int a=15;
        goStudentService(name->{ System.out.println("我叫:"+name);});
    }
    public static void goStudentService(StudentService studentService){
        studentService.print("李白");
    }
    public static void goUserService(UserService userService){//1.方法的参数必须是一个接口类型。 2.该接口有且只有一个抽象方法。
        String s = userService.show("王力宏", 15);
        System.out.println(s);
    }
}
@FunctionalInterface
interface UserService{ //为了防止别人往该接口中添加新的抽象方法,可以使用一个注解FunctionInterface。
    public String show(String name,int age);
    default void fun(){};
}
interface  StudentService{
    public void print(String name);
}

1.7 lambda表达式使用的前提

Lambda表达式的语法是非常简洁的,但是Lambda表达式不是随便使用的,使用时有几个条件要特别注意

  1. 方法的参数或局部变量类型必须为接口才能使用Lambda
  2. 接口中有且仅有一个抽象方法(@FunctionalInterface)
  3. 被@FunctionalInterface 修饰后该接口只能有一个抽象方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JDK1.8新特性---------lambda 的相关文章

  • Java Swing:从 JOptionPane 获取文本值

    我想创建一个用于 POS 系统的新窗口 用户输入的是客户拥有的金额 并且窗口必须显示兑换金额 我是新来的JOptionPane功能 我一直在使用JAVAFX并且它是不同的 这是我的代码 public static void main Str
  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • 多个 Maven 配置文件激活多个 Spring 配置文件

    我想在 Maven 中构建一个环境 在其中我想根据哪些 Maven 配置文件处于活动状态来累积激活多个 spring 配置文件 目前我的 pom xml 的相关部分如下所示
  • Spark 1.3.1 上的 Apache Phoenix(4.3.1 和 4.4.0-HBase-0.98)ClassNotFoundException

    我正在尝试通过 Spark 连接到 Phoenix 并且在通过 JDBC 驱动程序打开连接时不断收到以下异常 为简洁起见 下面是完整的堆栈跟踪 Caused by java lang ClassNotFoundException org a
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • 路径中 File.separator 和斜杠之间的区别

    使用有什么区别File separator和一个正常的 在 Java 路径字符串中 与双反斜杠相反 平台独立性似乎不是原因 因为两个版本都可以在 Windows 和 Unix 下运行 public class SlashTest Test
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • 为什么HashMap不能保证map的顺序随着时间的推移保持不变

    我在这里阅读有关 Hashmap 和 Hashtable 之间的区别 http javarevisited blogspot sg 2010 10 difference Between hashmap and html http javar
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • 在mockito中使用when进行模拟ContextLoader.getCurrentWebApplicationContext()调用。我该怎么做?

    我试图在使用 mockito 时模拟 ContextLoader getCurrentWebApplicationContext 调用 但它无法模拟 here is my source code Mock org springframewo
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • 编译器抱怨“缺少返回语句”,即使不可能达到缺少返回语句的条件

    在下面的方法中 编译器抱怨缺少退货声明即使该方法只有一条路径 并且它包含一个return陈述 抑制错误需要另一个return陈述 public int foo if true return 5 鉴于Java编译器可以识别无限循环 https
  • Spring Boot @ConfigurationProperties 不从环境中检索属性

    我正在使用 Spring Boot 1 2 1 并尝试创建一个 ConfigurationProperties带有验证的bean 如下所示 package com sampleapp import java net URL import j

随机推荐

  • AntV可视化图表G2-柱状图

    文章目录 前言 快速上手 特性 安装 浏览器引入 npm 安装 开始使用 浏览器引入方式 1 创建 div 图表容器 2 编写图表绘制代码 完整代码 在线代码 前言 G2 是一套基于可视化编码的图形语法 以数据驱动 具有高度的易用性和扩展性
  • 《Real-Time Rendering 3rd》提炼总结 RTR3读书笔记

    Real Time Rendering 3rd 提炼总结 毛星云 https zhuanlan zhihu com p 34207965 2 5 几何着色器 The Geometry Shader 几何着色器可以改变新传递进来的图元的拓扑结
  • npm 查看安装了哪些包的相关指令

    npm 查看安装了哪些包 指令1 npm list depth 0 depth 表示深度 我们使用的模块会有依赖 深度为零的时候 不会显示依赖模块 这个指令可以用来 显示 出我们的项目中安装了哪些模块 其实就是 package json 文
  • Linux网络服务:部署YUM仓库与NFS服务

    目录 一 理论 1 部署YUM仓库服务 2 NFS共享存储服务 二 实验 1 通过httpd服务建立yum仓库 2 通过vsftpd服务建立yum仓库 3 搭建NFS实现2台或3台服务器共享一个目录 一 理论 1 部署YUM仓库服务 1 Y
  • JdbcTemplate使用in条件查询sql

    在使用条件in的sql的时候 使用NamedParameterJdbcTemplat public Object getXXX String roleAuth long roleId NamedParameterJdbcTemplate n
  • Python基础(if条件判断)

    if条件判断的第一种情形 纯if if语句的语法规则 if 条件 代码 意思是如果条件成立就执行该代码 如果不成立 就不执行 money 100 if money gt 50 print 吃饭 print 回家 此处输出 吃饭 回家 若mo
  • SQLi LABS Less-4 联合注入+报错注入

    第四关是双引号 括号的字符型注入 推荐使用联合注入 报错注入 方式一 联合注入 参考文章 联合注入使用详解 原理 步骤 实战教程 第一步 判断注入类型 地址栏输入 id 1 and 1 a 页面正常显示 地址栏输入 id 1 and 0 a
  • OceanBase-一款功能无敌的多模数据库

    点击上方 小强的进阶之路 选择 星标 公众号 优质文章 及时送达 预计阅读时间 5分钟 NoSQL历史 KV型NoSql 代表 Redis 解决快速的读写问题 但是会丢失数据 搜索型NoSql 代表 ElasticSearch 支持快速的全
  • 拷贝构造函数和赋值构造函数声明为私有的作用

    转贴地址 http blog csdn net winer632 archive 2009 01 12 3762292 aspx 每个类只有一个赋值函数 由于并非所有的对象都会使用拷贝构造函数和赋值函数 程序员可能对这两个函数有些轻视 请先
  • 多线程练习之数字加减

    数字加减 题目 设计 4 个线程对象 两个线程执行减操作 两个线程执行加操作 使其返回结果为0 1 0 1 或为0 1 0 1 public class ThreadTest public static void main String a
  • 学生如何免费激活JetBrain所有产品(PyCharm,IDEA......)

    前提 版权意识的重要性不言而喻 抛去法律等的规则来说 可以近似理解为一种对别人付出的尊重 本文为学生免费激活JetBrain所有产品 PyCharm IDEA https www jetbrains com 进入jetBrains的官网 点
  • 雷军22年前写的代码 你见过吗?

    作为小米科技的创始人 董事长和首席执行官 雷军的名字如雷贯耳 网上出现一篇 刘强东的代码水平如何 的文章 有网友在下面回复 代码只服雷军 这个回复吸引了小编的注意 雷军的代码水平真的很牛吗 原来雷军年轻的时候 也是一名程序员 而且一干就是1
  • C语言用牛顿迭代法和二分法递归求解三元一次方程

    求解方程 2x 3 4x 2 3x 6 0 牛顿迭代法 牛顿迭代法公式 以下图片均来源于百度 牛顿迭代法用递归实现解三元一次方程 include
  • 实现3D物体拆解组装的详细步骤和示例代码

    拆分3D物体 使用3D建模软件将原始3D模型拆分成多个可独立控制的部分 并将每个部分导入到Unity中 创建GameObject并添加脚本 在Unity中 为每个部分创建一个独立的GameObject 并为其添加相应的脚本 这些脚本可以控制
  • Android LRecyclerView实现下拉刷新,滑动到底部自动加载更多

    http blog csdn net lmj623565791 article details 45059587
  • c# Byte解压,压缩

    using ICSharpCode SharpZipLib GZip using System using System Collections Generic using System IO using System Linq using
  • 方差分析(ANOVA)的基本原理及R实现(单因素)

    方差分析 analysis of variance ANOVA 几乎是在统计学分析中最常用的方法 通过分析各变量的主效应 main effect 和交互效应 interaction effect 从而发现因变量 dependent vari
  • 音标发音规则

    一 辅音字母的读音规则 1 c 在字母e i y前读 s 如cell cit y cyst 其余情况下读 K 如cat club code 2 g 在字母e i y前读 如gene gin gym 其余情况下读 g 如beg golf ga
  • [图论]---[网络流]---最大权闭合子图

    最大权闭合子图 闭合图的概念 闭合图建立在有向图之上 对于 G V E 选取一个点的子集 V V 的任意一点的所有能到达的点也在集合 V 内 则称 V 为闭合子图 最大权闭合子图即在G的所有闭合子图中 点权和最大的 最大权闭合子图的求法 构
  • JDK1.8新特性---------lambda

    1 Lambda表达式 1 1 概念 Lambda表达式 特殊的匿名内部类 语法更加简洁 是JDK1 8中的新特性 Lambda表达式允许把函数作为一个方法的参数 函数作为方法参数传递 将代码像数据一样传递 1 2 需求 1 开启一个线程