java-新手笔记-(Lambda表达式, 匿名内部类,作用域,闭包)

Lambda表达式

定义:可以看作是一种没有名称(即匿名)的函数。Lambda表达式主要用于表示那些只有一个抽象方法的接口(即函数式接口)的实例.

这边可以用接口定义抽象的方法,再用lambda继续完善方法,注意的是 接口是只支持单一函数lambda调用. 用@FunctionalInterface

(parameters) -> expression 或 (parameters) -> { statements; }

参数列表描述了函数的输入,箭头符号将参数列表与函数体连接起来,函数体则描述了函数的具体行为。

模版 

// 定义一个函数式接口  
@FunctionalInterface  
interface Greeting {  void sayHello(String name);  
}  public class Main {  public static void main(String[] args) {  // 使用Lambda表达式创建Greeting接口的实例  Greeting greeting = name -> System.out.println("Hello, " + name);  // 调用Lambda表达式表示的方法  greeting.sayHello("World");  }  
}

匿名内部类

匿名内部类在Java中用于创建一个没有名称的类实例,它通常用于实现接口或扩展一个类

注意的是:interface没有用@FunctionalInterface函数接口

模版

interface Greeting {  void sayHello();  
}  public class AnonymousInnerClassExample {  public static void main(String[] args) {  // 使用匿名内部类实现 Greeting 接口  Greeting greeting = new Greeting() {
//新建一个类,然后重写了sayHello方法  @Override  public void sayHello() {  System.out.println("Hello, World from Anonymous Inner Class!");  }  };  // 调用匿名内部类实现的方法  greeting.sayHello();  }  
}

 匿名内部类和lambda区别

接口中只有一个抽象方法且需要更简洁的语法时,建议使用Lambda表达式;而当接口中有多个抽象方法或需要更多灵活性时,可以使用匿名内部类。

在了解闭包之前 先了解一下作用域

局部变量作用域:是在类的主体中声明的变量 如 int b =10;

实例变量作用域:在类的主体中声明的变量 

public class Person {  
    // 实例变量  
    String name;  
    int age;

 public void setName(String name) {  
        this.name = name; // 在方法内部访问和修改实例变量  
    }    }

 类变量(静态变量)作用域:在Java中的作用域是整个类,这意味着它们可以在类的任何方法或代码块中被访问,而无需创建类的实例

public class StaticVariableExample {  // 静态变量(类变量)  public static int staticVar = 42;  public static void main(String[] args) {  // 通过类名直接访问静态变量  System.out.println("静态变量的值:" + StaticVariableExample.staticVar);  // 创建类的实例  StaticVariableExample instance = new StaticVariableExample();  // 通过对象实例访问静态变量(尽管不推荐这样做)  System.out.println("通过实例访问静态变量的值:" + instance.staticVar);  // 修改静态变量的值  StaticVariableExample.staticVar = 100;  // 再次打印静态变量的值,以验证其已被修改  System.out.println("修改后的静态变量的值:" + StaticVariableExample.staticVar);  }  
}

方法作用域:方法内部声明的局部变量和参数的作用域。它们只能在该方法内部被访问。

void print(){System.out.println("VariableHolder.print");
}

 

参数作用域:方法参数的作用域仅限于该方法内部。一旦方法执行完毕,参数变量就会被销毁。

 

void print(String name){System.out.println("name = " + name);
}

块作用域:块作用域指的是在代码块(如if语句、for循环等)内部声明的变量的作用域 

闭包

闭包可以被视为一个能够访问和操作在其外部作用域中定义的变量的Lambda表达式或匿名内部类。由于Lambda表达式可以捕获其所在上下文的变量,因此它们可以保留对外部变量的引用,并在稍后的时间点执行时访问这些变量,即使这些变量在Lambda表达式定义之后的外部作用域中已经不再可用。

模版

public class UsingLambda{public static void main(String[] args) {// 定义一个外部变量final int outerVariable = 10;// 使用Lambda表达式创建一个闭包Runnable closure = () -> {System.out.println("outerVariable inside closure: " + outerVariable);};// 执行闭包closure.run(); // 输出:outerVariable inside closure: 20}}

这边使用了Runnable 接口是为了实现代码的复用,可以不在定义一个@FunctionalInterface函数接口的接口

注意的是 outerVariable是最终变量,如果需要更改的话,可以封装一个对象类解决

public class UsingLambda {public static void main(String[] args) {// 创建一个包含外部变量的对象class VariableHolder {int value = 10;}VariableHolder holder = new VariableHolder();// 使用Lambda表达式创建一个闭包,闭包捕获的是holder对象的引用Runnable closure = () -> {System.out.println("outerVariable inside closure: " + holder.value);};// 改变外部变量的值,通过修改holder对象的状态holder.value = 20;// 执行闭包closure.run(); // 输出:outerVariable inside closure: 20}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Excel生成 chart 混合图表

在开发中有这样一个需求,邮件预警的时候,要求邮件主体内容是一个Chart 图表(生成后的img),邮件需要有附件,且附件是Excel列表加图表,图表类型是混合图。 回顾:在之前一篇讲到如何使用…

LLM Saturation与多模态AI的崛起

LLM Saturation与多模态AI的崛起 近年来,大型语言模型(LLM)在语言理解和生成能力上取得了显著进步,如GPT-4和LLaMA-2等。然而,我们可能正接近LLM范式的极限。本文探讨LLM性能天花板、局限性,以及多模态AI为…

SQL 多表查询

文章目录 多表查询的分类等值连接非等值连接自连接非自连接内连接外连接左外连接右外连接满外连接 SQL连接 JOINSQL99 语法新特性 自然连接 NATURAL JOIN & USING 多表查询的分类 等值连接 VS 非等值连接自连接 VS 非自连接内连接 VS 外连接 等值连接 关联的表有连接字段…

【c语言 】 函数入门

🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:C语言 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步&…

Java常见数据结构“ 栈与队列 ”学完就去编程!!!

一、栈(Stack): 栈是一种后进先出(LIFO,Last In First Out)的数据结构,类似于现实生活中的一叠盘子,最后放入的盘子最先被取出。 主要方法和特点: push(E e): 将元素推…

突破编程_C++_设计模式(模板方法模式)

1 模板方法模式的基本概念 C 模板方法模式是一种行为设计模式,它在一个操作中定义算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下重新定义算法的某些特定步骤。在C中,模板方法模式通常通过使用虚函数和…

MySQl基础入门⑦

上一章知识内容 分析数据且区分数据类型 看下表分析数据的特征,根据其特征确定相应的数据类型。 分析以上表格特征,确定数据类型,并对数据进行分类。分析数据后按固定长度字符串、可变长度字符串、整数、固定精度小数和日期时间数据类型对数…

【树】-Lc101-对称二叉树(一棵树是否是另一棵树的子树的变形)

写在前面 最近想复习一下数据结构与算法相关的内容,找一些题来做一做。如有更好思路,欢迎指正。 目录 写在前面一、场景描述二、具体步骤1.环境说明2.代码 写在后面 一、场景描述 对称二叉树。给给定一个二叉树,检查它是否是镜像对称的。 例…

spring-data-elasticsearch官方文档解读(部分)

Spring Data Elasticsearch 这里主要学习的是4.4.16版本的文档 1. 版本 下表显示了 Spring Data 发行版系列使用的 Elasticsearch 版本和其中包含的 Spring Data Elasticsearch 版本,以及引用该特定 Spring Data 发行版系列的 Spring Boot 版本。给出的 Elastics…

keepalived原理以及lvs、nginx跟keeplived的运用

keepalived基础 keepalived的原理是根据vrrp协议(主备模式)去设定的 vrrp技术相关原理 状态机; 优先级0~255 心跳线1秒 vrrp工作模式 双主双备模式 VRRP负载分担过程 vrrp安全认证:使用共享密匙 keepalived工具介绍 keepal…

Qt 绘制中的视口(setViewport)和窗口(setWindow)

重点 : 1.绘制(QPainter)可以设置视口,视口下设置窗口,而绘制的构件是以窗口为坐标系进行绘画。 2.先根据绘图设备的物理坐标系的矩形位置,设置视图视口setViewport,然后在以视口为区域去设置…

【Leetcode刷题】1360. 日期之间隔几天

1360. 日期之间隔几天 简单 请你编写一个程序来计算两个日期之间隔了多少天。 日期以字符串形式给出,格式为 YYYY-MM-DD,如示例所示。 示例 1: 输入:date1 “2019-06-29”, date2 “2019-06-30” 输出:1 示例 2…

博客杂谈---程序员如何选择职业赛道?

程序员的职业赛道就像是一座迷宫,有前端的美丽花园,后端的黑暗洞穴,还有数据科学的神秘密室。你准备好探索这个充满挑战和机遇的迷宫了吗?快来了解如何选择职业赛道吧! (1)考虑因素 话题虽然指…

Web题记

[CISCN 2019华北Day2]Web1 告诉我们想要的东西在flag表和flag字段,那应该是sql注入,先试试 试了一些发现会被检查到,随便传数字 除了1和2有返回结果,其余的都报错,应该是数字型注入,抓包看看过滤了哪些 这个…

在DeepLn环境中安装VLLM与ChatGLM3

DeepLn | 智慧算力触手可及是一个挺便宜的算力租用平台,里面有大量的显卡可以租用。唯一美中不足的是,提供的pytorch版本低,只支持到2.01,为了匹配vllm,需要手动安装指定版本的pytorch。 vllm介绍 总体而言&#xff0…

如何关闭vscode灰色代码提示

vscode编辑rust代码时,rust-analyze插件会默认给代码添加一些提示(灰色代码),这部分代码 不会保存到文件,仅仅是为了你方便看各种变量的定义等。 但有时会觉得代码很乱,所以按以下方法可以把他隐藏。 1&am…

接收端编程、UDP编程练习、wireshrak抓包工具、UDP包头

我要成为嵌入式高手之3月6日Linux高编第十六天&#xff01;&#xff01; ———————————————————————————— 学习笔记 接收端 recvfrom #include <sys/types.h> #include <sys/socket.h> ssize_t recvfrom(int sockfd, void *buf, si…

JVM(Java虚拟机)概述

1. JVM的定义和作用 JVM&#xff08;Java Virtual Machine&#xff09;是一个能够运行Java字节码的虚拟计算机。它是Java平台的核心组成部分&#xff0c;负责执行编译后的Java程序&#xff0c;提供跨平台运行的能力。JVM使得Java程序可以在任何安装了JVM的操作系统上运行&#…

【50天50个项目】旋转导航页面

实现效果&#xff1a; HTML <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><link rel"stylesheet&…

asp飞机订票-57-(说明+代码)

演示查看 http://pc.3q2008.Com/3q2008_Com/hkdp 目 录 1&#xff0e; 系统规划 3 1&#xff0e;1 行业背景 3 1&#xff0e;2 行业现状 3 1.2.1用户注册 3 1.2.2航班查询 3 1.2.3在线订票 3 1.2.4在线支付 3 1.2.5电子客票 4 1.2.6其它辅助产品与服务 4 1&#xff0e;3 需求…