lambda

文章目录

  • lambda 概述
  • lambda的演变过程
    • lambda 表达式的基本格式
    • 案例:调用接口里面的方法几种方式
  • lambda省略写法
    • 案例一:抽象方法一个参数
    • 抽象方法两个参数
  • 啦么大 使用的注意事项
  • 啦么大 与 匿名内部类

lambda 概述

函数式编程思想

面向对象思想在乎的是,一切的动作通过对象的形式去完成

而函数式编程思想,更在乎做什么,而不是通过什么形式去做

demo: 简单的应用 - 使用lambda实现线程

定义一个MyThread类 - 继承Thread类

/**
 * @Classname : MyThread
 * @Description : TODO
 * @Author : lin_refuel@qq.com
 */
public class MyThread extends Thread{
   // 重写run方法
    @Override
    public void run() {
        System.out.println("通过继承Thread类实现线程");
    }
}

定义一个MyRunable的接口作为Runnable接口的实现类

/**
 * @Classname : MyRunnable
 * @Description : TODO
 * @Author : lin_refuel@qq.com
 */
public class MyRunnable implements Runnable {
    @Override
    //重新run方法
    public void run() {
        System.out.println("通过Runnable接口方式实现线程");
    }
}

demo01测试类

/**
 * @Classname : demo01
 * @Description : TODO Lambda - 简单应用
 * @Author : lin_refuel@qq.com
 */
public class demo01 {
    public static void main(String[] args) {
          // 实现线程的几种方式
        // 1. 通过继承Thread类实现线程
        MyThread mt = new MyThread();
        mt.start();
        // 通过Runnable接口方式实现线程
        MyRunnable myRunnable = new MyRunnable();
        new Thread(myRunnable).start();
        // 通过匿名内部类实现线程
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("匿名内部类实现多线程");
            }
        }).start();
        // TODO*****************************************
        // 通过Lambda方式实现线程
        // 直接告诉线程需要做那些事情
        new Thread(()->{
            System.out.println("通过Lambda方式实现多线程");
        }).start();

    }
}

运行结果:
在这里插入图片描述

lambda的演变过程

lambda 表达式的基本格式

  • 啦么大 表达式使用的前提

    • 有一个接口

    • 并且接口中有且仅有一个抽象方法

==========================================

  • ():形参列表 - 要实现的接口中唯一的抽象方法所对应的形参列表

  • ->:要做的事情 - 固定格式

  • {}:方法体 - 被重写的方法体的固定格式

案例:调用接口里面的方法几种方式

demo:

定义一个名字为eat的接口

package com.itxs.demo02;

/**
 * @Classname : eat
 * @Description : TODO 吃 - 接口
 * @Author : lin_refuel@qq.com
 */
public interface eat {
    // 吃的抽象方法, food:吃的食物
    void eats(String food);
}

创建一个eat接口的实现类eatTest

package com.itxs.demo02;

/**
 * @Classname : eatTest
 * @Description : TODO
 * @Author : lin_refuel@qq.com
 */
public class eatTest implements eat{
    // 对接口eat里面的抽象方法eats进行重写
    @Override
    public void eats(String food) {
        System.out.println("我中午想吃" + food);
    }
}

测试类demo01

package com.itxs.demo02;

/**
 * @Classname : demo01
 * @Description : TODO 测试类
 * @Author : lin_refuel@qq.com
 */
public class demo01 {
    public static void main(String[] args) {
        // 第一种方式:接口存储实现类的方式
        eats(new eatTest());
        // 第二种方式:匿名内部类的方式进行调用
        eats(new eat() {
            @Override
            public void eats(String food) {
                System.out.println("小肆中午想吃" + food);
            }
        });
        // 第三种lambda方式
        eats((String food)->{
            System.out.println("哥们中午吃啥?吃"+food);
        });
        System.out.println("================================");
        // 第四种方式,lambda的实现过程
       eat s = (String food)->{
            System.out.println("哥们中午吃啥?吃"+food);
        };
       s.eats("烤鸡");
    }

    /**
     * 接口测试方法,调用接口里面的抽象放法eats
     * @param e 不同方式创建的eat类型的空间
     */
    private static void eats(eat e){
        e.eats("烧鹅");
    }
}

运行结果:
在这里插入图片描述

lambda省略写法

  • 参数的类型可以省略

  • 如果参数有且仅有一个,小括号可以省略不写

  • 如果代码块的语句只有一条,可以省略大括号和分号(如果有 return 则 return 需要一同删掉)

案例一:抽象方法一个参数

demo:

创建一个eat接口

package com.itxs.demo03;

/**
 * @Classname : eat
 * @Description : TODO 吃的接口
 * @Author : lin_refuel@qq.com
 */
public interface eat {
    // 吃饭的抽象方法
    // food:食物
    void dine(String food);
}

demo01:调用上面接口,测试lambda写法

package com.itxs.demo03;

/**
 * @Classname : demo01
 * @Description : TODO
 * @Author : lin_refuel@qq.com
 */
public class demo01 {
    public static void main(String[] args) {
          // 3种方式实现接口
          // 通过匿名内部类方式实现
          eatTest(new eat() {
              @Override
              public void dine(String food) {
                  System.out.println("小三中午吃的是" + food);
              }
          });
          // 3. 完整的lambda
        eatTest((String food)->{
            System.out.println("小六中午吃的的是" + food);
        });
          // 4. lambda简写
        eatTest(food -> System.out.println("小八中午吃的是" + food));
    }
    private static void eatTest(eat e){
        e.dine("苹果");
    }
}

运行结果:
在这里插入图片描述

抽象方法两个参数

创建一个名字为ADD的接口

package com.itxs.demo03;

/**
 * @Classname : ADD
 * @Description : TODO 计算两个数相加的接口
 * @Author : lin_refuel@qq.com
 */
public interface ADD {
    Integer addition(Integer a,Integer b);
}

demo02:测试类,调用上面的接口

package com.itxs.demo03;

/**
 * @Classname : demo02
 * @Description : TODO
 * @Author : lin_refuel@qq.com
 */
public class demo02 {
    public static void main(String[] args) {
        // 3种方式调用接口ADD里面的方法
        // 通过匿名内部类
        red(new ADD() {
            @Override
            public Integer addition(Integer a, Integer b) {
                return a + b;
            }
        });
        //通过lambda方式进行实现
        red((Integer a, Integer b) -> {
            return a - b;
        });
        //lambda简写
        //省去形参的类型 里面只有一行代码省去大括号,
        red((a, b) -> a * b);
    }

    private static void red(ADD a) {
        Integer res = a.addition(7, 8);
        System.out.println("res = "+ res);
    }
}

运行结果:
在这里插入图片描述

啦么大 使用的注意事项

  • 要实现的接口中保证:有且仅有一个抽象方法 (叫做函数式接口)

  • 必须有类型指向,才能确定 啦么大 对应的接口(传参 或者 多态)

啦么大 与 匿名内部类

  • 内部类 - 万能,接口、抽象类、普通的类均可

  • 啦么大 - 接口!只能针对于接口,其他类则不可以,而且接口中要求有且仅有一个抽象方法

  • 匿名内部类在编译运行的时候会生成可见的 字节码文件(.class),啦么大 则不会

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/336839.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java 面向对象02 封装 (黑马)

人画圆:画圆这个方法应该定义在园这个类里面。 人关门:是人给了门一个作用力,然后门自己关上了门,所以关门的方法是在门的类里面 封装对象的好处: 调用Java自带的方法举例实现: 在测试类中,对其…

PDshell16逆向PostgreSQL 工程显示字段comment备注

现状:当刚逆向成功的表结构是没有原来表结构中的,comment备注如下 然后pd逆向工程的sql已经返回了这个备注的含义 解决方案: 1、设置显示注释列 tools——Display Preferences…如下 勾选-按照下面得方式勾选这三个 复制这里的VBS脚本&a…

触摸屏监控双速电动机-确定地址分配

I/O地址分配 当选择了PLC之后,首先需要确定的是系统中各I/O点的绝对地址。在某些PLC 中1/O绝对地址的分配方式共有固定地址型、自动分配型、用户定义型3种。实际所使用的方式取决于所采用的PLC的CPU型号、编程软件、软件版本、编程人员的选择等因素。 本任务输入信…

51单片机原理及应用张毅刚版课后习题以及答案

AT89S51单片机内部集成了哪些外围功能部件 ①8位微处理器CPU ②数据存储器 128B RAM ③程序存储器 ④4个8位可编程并行I/O口 ⑤1个全双工的异步串行口 ⑥2个可编程的16位定时器/计数器 ⑦1个看门狗定时器WDT ⑧中断系统具有五个中断源 五个中断向量 ⑨特殊功能寄存器SFR 26个…

低代码技术杂谈

一、探讨低代码的定义 “Low-Code”是什么?身为技术人员听到这种技术名词,咱们第一反应就是翻看维基百科 或者其他相关技术论文,咱们想看维基百科的英文介绍: A low-code development platform (LCDP) provides a development env…

web蓝桥杯真题--11、蓝桥知识网

介绍 蓝桥为了帮助大家学习,开发了一个知识汇总网站,现在想设计一个简单美观的首页。本题请根据要求来完成一个首页布局。 准备 开始答题前,需要先打开本题的项目代码文件夹,目录结构如下: ├── css │ └──…

【JavaEE Spring】SpringBoot 配置文件

SpringBoot 配置文件 1. 配置文件的作用1.1 配置文件的说明1.2 SpringBoot 配置文件 2. 配置文件的格式特殊说明 3. properties 配置文件说明3.1 properties 基本语法3.2 读取配置文件3.3 properties 缺点分析 4. yml 配置文件说明4.1 yml 的基本语法4.2 yml 使⽤进阶4.2.1 yml…

大语言模型无代码构建知识图谱概述

2023年3月15日,ChatGPT4.0的横空出世,将人们对大语言模型的关注推到了风口浪尖。由于其在智能问答、翻译以及文本生成等工作任务上的卓越表现,业界一度出现了不再需要发展知识图谱相关技术的观点,知识图谱相关概念严重受挫。无可置…

【设计模式】文件目录管理是组合模式吗?

组合模式是什么? 组合模式是一种将对象组合成树形结构以表示"部分-整体"的层次结构的设计模式。它使得用户对单个对象和组合对象的使用具有一致性。 组合模式在什么情况下使用? 当你发现你需要在代码中实现树形数据结构,让整体-部…

无人机航迹规划(一)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划(提供MATLAB代码)

一、七种算法(DBO、LO、SWO、COA、LSO、KOA、GRO)简介 1、蜣螂优化算法DBO 蜣螂优化算法(Dung beetle optimizer,DBO)由Jiankai Xue和Bo Shen于2022年提出,该算法主要受蜣螂的滚球、跳舞、觅食、偷窃和繁…

Flutter 与 Android原生 相互通信:BasicMessageChannel、MethodChannel、EventChannel

前言 本文主要讲解,使用不同的 Channel 让 Flutter 和 Android原生 进行通信,由于只是讲解两端通信,所以可视化效果不好; 不过我写了一篇专门讲解 Flutter 嵌入 Android原生View的文章 Flutter 页面嵌入 Android原生 View-CSDN…

【富文本编辑器实战】02 编写编辑器配置文件

编写编辑器配置文件 目录 编写编辑器配置文件前言项目结构分析项目配置菜单项配置语言配置总体配置 总结 前言 本篇文章主要内容是项目的配置文件的编写与讲解,包括菜单项配置、语言配置、总体配置。 项目结构分析 下图是编辑器的总体结构: 编辑器大致…

蓝桥杯真题(Python)每日练Day2

题目 题目分析 对于本题首先确定其数据结构为优先队列,即邮费最小的衣服优先寄,算法符合贪心算法。可以直接使用queue库的PriorityQueue方法实现优先队列。关于PriorityQueue的使用方法主要有: import queue q queue.Queue()# 队列 pq qu…

Django随笔

关于Django的admin 1. 在url中把 from django.contrib import admin 重新解开 把path(admin/,admin.site.urls), 解开 2. 注册app,在配置文件中写 django.contrib.admin, 3.输入命令进行数据库迁移 Django国际化 配置文件中(改成中文) LA…

云轴科技ZStack位列IDC云系统软件市场教育行业TOP2

近日,全球IT市场研究和咨询公司IDC发布 《中国云系统软件市场跟踪报告2023H1》 ZStack作为产品化的云基础软件提供商 位居云系统软件市场第一梯队 市场份额位列独立云厂商*第一 增速最快 教育行业TOP2 在教育行业,云计算已成为教育行业信息化的重要基础…

十一、常用API——爬虫

目录 爬虫本地爬虫和网络爬虫贪婪爬取和非贪婪爬取正则表达式在字符串方法中的使用捕获分组和非捕获分组分组捕获分组非捕获分组 爬虫 本地爬虫和网络爬虫 有如下文本,请按照要求爬取数据。(本地爬虫) Java自从95年问世以来,经历…

红队渗透靶机:TOPPO: 1

目录 信息收集 1、arp 2、nmap 3、nikto 4、whatweb 5、dirsearch WEB tips1 tips2 SSH登录 提权 系统信息收集 本地 信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:69:c7:bf, IPv4: 192.168.110…

重构改善既有代码的设计-学习(一):封装

1、封装记录(Encapsulate Record) 一些记录性结构(例如hash、map、hashmap、dictionary等),一条记录上持有什么字段往往不够直观。如果其使用范围比较宽,这个问题往往会造成许多困扰。所以,记录…

【LeetCode每日一题】2809. 使数组和小于等于 x 的最少时间

2024-1-19 文章目录 [2809. 使数组和小于等于 x 的最少时间](https://leetcode.cn/problems/minimum-time-to-make-array-sum-at-most-x/)思路: 2809. 使数组和小于等于 x 的最少时间 思路: 获取两个列表的长度n,并初始化一个二维数组f&…

深耕文档型数据库12载,SequoiaDB再开源

1月15日,巨杉数据库举行SequoiaDB新特性及开源项目发布活动。本次活动回顾了巨杉数据库深耕JSON文档型数据库12年的发展历程与技术演进,全面解读了SequoiaDB包括在高可用、安全、实时、易用性四个方向的技术特性,宣布了2024年面向技术社区的开…