JAVA-JDK8的特性之Lambda表达式

2023-11-15

1、Lambda表达式

2、函数式接口

3、方法引用

4、Stream流

5、日期时间类

1、Lambda表达式

1.1、Lambda的由来

package demo01;

public class Test01 {
    public static void main(String[] args) {
        //开启一个线程  该构造函数需要传递一个Runnable类型的接口参数
        Thread thread = new Thread(new My());
        thread.start();  //开启线程

        //匿名内部类
        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("使用匿名内部类类来完成-------------------->线程任务");
            }
        });
        thread1.start();  //开启线程
    }
}

class My implements Runnable{
    @Override
    public void run() {
        System.out.println("使用实现类来完成-------------------->线程任务");
    }
}

1.2、需求分析

  1. Thread类需要一个Runnable接口作为参数,其中的抽象方法run方法是用来指定线程任务内容的核心

  2. 为了指定run方法体,不得不需要Runnable的实现类

  3. 为了省去定义一个Runnable 的实现类,不得不使用匿名内部类

  4. 必须覆盖重写抽象的run方法,所有的方法名称,方法参数,方法返回值不得不都重写一遍,而且不能出错,

  5. 而实际上,我们只在乎方法体中的代码.

 1.3、初体验Lambda表达式

  //Lambda表达式
        Runnable runnable1=()->{
            System.out.println("这是lambda表达式完成线程任务");
        };
        Thread thread2 = new Thread(runnable1);
        thread2.start();

1.4、Lambda表达式的语法

Lambda省去了面向对象的条条框框,Lambda的标准格式由3个部分组成:

(参数列表)->{}
():参数列表
->:连接符 连接的是参数以及方法体。
{}: 方法体。

 练习无参无返回值

package demo02;

public class Test02 {
    public static void main(String[] args) {
        //主函数调用fun方法  第一种:创建UserService接口的实现类,并创建该实现类对象
        //第二种:匿名内部类方法
//        UserService userService = new UserService() {
//            @Override
//            public void show() {
//                System.out.println("这是匿名内部类的show方法实现");
//            }
//        };
//        fun(userService);
        //第三种:lambda表达式---该接口必须为函数式接口
        UserService userService =()->{
            System.out.println("lambda表示的show方法");
        };
        fun(userService);
    }
    public static void fun(UserService userService){
        userService.show();
    }
}
//函数式接口-->里面有且仅有一个抽象方法。--只有这种接口才能使用lambda表达式
@FunctionalInterface
interface UserService{
    public void show();
}

练习有参有返回值

package demo03;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Test03 {
    public static void main(String[] args) {
        List<Person> personList = new ArrayList<>();
        personList.add(new Person("张三",15));
        personList.add(new Person("李四",5));
        personList.add(new Person("王五",55));
        personList.add(new Person("赵六",25));
        personList.add(new Person("钱七",85));
        //对集合中的元素按照年龄排序
        //Collections:集合工具类
//        Comparator<Person> comparator = new Comparator<Person>() {
//            @Override  //如果是0表示相同  大于0表示o1大于o2
//            public int compare(Person o1, Person o2) {
//                return o1.getAge()- o2.getAge();
//            }
//        };
//        Collections.sort(personList,comparator);
//        System.out.println(personList);

        //就是对函数式接口中抽象方法的简写。
        Comparator<Person> comparator=(o1,o2)->{
          return o1.getAge()-o2.getAge();
        };
        Collections.sort(personList,comparator);
        System.out.println(personList);
    }
}


class Person{
    private String name;
    private Integer age;

    public Person() {
    }

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public Integer getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(Integer age) {
        this.age = age;
    }

    public String toString() {
        return "Person{name = " + name + ", age = " + age + "}";
    }
}

 2.5、Lambda表达式的省略写法

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

  1. 小括号内的参数类型可以省略[]

  2. 如果小括号内有且仅有一个参数,则小括号可以省略

  3. 如果大括号内有且仅有一个语句,可以同时省略大括号,return 关键字及语句分号。

package demo04;

public class Test04 {
    public static void main(String[] args) {
        U01 u01 =a-> //省略小括号和大括号
            System.out.println("加达里无畏舰:"+a);
        fun(u01);
    }

    public static void fun(U01 u01){
        u01.show("凤凰级");
    }
}
interface U01{
    public void show(String a);
}

2.6、Lambda表达式使用的前提

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

  1. 方法的参数或局部变量类型必须为接口才能使用Lambda

  2. 接口中有且仅有一个抽象方法(@FunctionalInterface)

后面我们使用lambda表达式主要核心使用再Stream流中

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAVA-JDK8的特性之Lambda表达式 的相关文章

随机推荐

  • 使用R语言和LSTM实现时间序列异常检测

    目录 引言 长短期记忆网络 LSTM 时间序列异常检测的步骤 准备工作 数据获取
  • ES6 Iterator

    不同数据集合怎么用统一的方式读取 可以用for of循环了 转载于 https www cnblogs com moneyss p 10641507 html
  • 双向链表,单向链表//循环

    head h ifndef HEAD H define HEAD H include
  • 将Oracle zip安装文件转换成Linux可用的iso镜像

    在Oracle官网下载得到的zip安装文件 要在VMware虚拟机上挂载iso安装Oracle 所以想将zip文件转化为iso 除了使用UltraISO软件外 这里尝试使用Linux mkisofs命令生成ISO 9660文件 mkisof
  • IOS 网络初探(一) - NSURLConnection

    在IOS中 除了最基本的socket外 苹果提供了NSURLConnection类来实现网络通信 请求服务器数据 GET方式 请求服务器数据分成异步和同步两种方式 先来看看异步 非阻塞 NSURL url NSURL URLWithStri
  • LPDDR4 JEDEC标准测试实例解析--写操作

    在LPDDR4的JEDEC标准中 写操作相关的时序参数要求基本都是围绕DQS信号 如下图所示 图中的单位 tCK 指的是时钟信号的工作周期 tCK的测试方法如下图所示 Write preamble and postamble设置 这一步对于
  • 3.1 Git 分支 - 分支简介

    3 1 Git 分支 分支简介 版本说明 版本 作者 日期 备注 0 1 loon 2019 3 23 初稿 目录 文章目录 3 1 Git 分支 分支简介 版本说明 目录 1 分支简介 Figure 9 首次提交对象及其树结构 Figur
  • Pycharm

    运行该程序 窗口底部会出现终端面板 Terminal pane 显示你的代码输出结果 使用Pycharm在运行过程中 查看每个变量的操作 show variables pytharm能不能像MATLAB一样显示中间变量的值呢 答案是可以的
  • Vue3.0 组合式 API 分析与实践

    本文带大家深入理解组合式 API 的设计详情 同时加入我们的实践经验总结 01 背景 Vue3 x 版本的出现带来了许多令人眼前一亮的新特性 其中组合式 API Composition API 一组附加的 基于功能的 API 被作为一种新的
  • 51单片机学习之-中断

    中断 在51单片机中共5个中断源 分别为 总的来说分为内部中断与外部中断 先说内部中断 也就是上图的两种定时器中断 T0 T1 它们的使用与4个寄存器有关 现在来介绍四种寄存器 中断允许寄存器 中断优先级寄存器 定时器工作方式寄存器 定时器
  • 151. 反转字符串中的单词

    1 题目地址 151 反转字符串中的单词 2 题目描述 给你一个字符串 s 请你反转字符串中 单词 的顺序 单词 是由非空格字符组成的字符串 s 中使用至少一个空格将字符串中的 单词 分隔开 返回 单词 顺序颠倒且 单词 之间用单个空格连接
  • vba与python的优缺点_对比VBA学Python操作Excel

    关于先学VBA还是先Python 或者作为办公族选什么 这些问题 我已经写了专题 就不再啰嗦 建议先阅读 讨论 学习VBA还是Python 但是大家一直还是被Python吸引 所以小编就说一期Python操作Excel吧 大部分教编程的 对
  • tensorflow 混合精度训练相关报错

    如题 在混合精度开发的时候遇到的报错 先列环境 V100服务器 ubuntu16 04 tensorflow 1 14 0 cuda10 0 python3 6 报错一 ValueError opt must be an instance
  • MySQL进阶语句

    目录 常用查询 order by按关键字排序 升序排序 降序排序 结合where进行条件过滤再排序 多字段排序 and or判断 and or 且与或的使用 嵌套 多条件使用 distinct 查询不重复记录 GROUP BY对结果进行分组
  • 经济,jiaxi

  • moviepy音视频开发:音频合成类CompositeAudioClip介绍

    前往老猿Python博文目录 CompositeAudioClip是AudioClip的直接子类 用于将几个音频剪辑合成为一个音频剪辑 CompositeAudioClip类只有一个构造方法 在构造方法内定义了一个内嵌函数make fram
  • 蓝屏错误代码分析和解决方法

    文字代码 可能的原因 可尝试的解决方法 0x00000001 APC INDEX MISMATCH 驱动出现问题 或安装了错误 不兼容的驱动 更新 重新安装相应设备官网的驱动 0x00000005 INVALID PROCESS ATTAC
  • VSCode的Pettier插件原理和设置

    最近写了一个 Prettier 插件 可以达到这样的效果 同事每次保存代码的时候 import 语句的顺序都会随机变 但是他去 prettier 配置文件里还啥也发现不了 于是就会一脸懵逼 那么这个同事发现了会打你的 prettier 插件
  • 在生信中利用Chat GPT/GPT4

    论文链接Ten Quick Tips for Harnessing the Power of ChatGPT GPT 4 in Computational Biology Papers With Code 之前在paper with cod
  • JAVA-JDK8的特性之Lambda表达式

    1 Lambda表达式 2 函数式接口 3 方法引用 4 Stream流 5 日期时间类 1 Lambda表达式 1 1 Lambda的由来 package demo01 public class Test01 public static