【Java数据结构】——枚举以及Lambda表达式

目录

1 枚举背景及定义

🚩使用

🎈、switch语句

🎈、常用方法

🎈.构造方法

2. Lambda表达式

🚩背景

🎈Lambda表达式的语法

🌈函数式接口

🌈Lambda表达式的基本使用

❗无参无返回值

❗无返回值一个参数

❗无返回值一个参数

❗有返回值无参数

❗有返回值一个参数

❗有返回值多参数

🎈Lambda在集合当中的使用

🌈Collection接口 forEach() 方法演示

🌈List接口 sort()方法的演示

🌈Map接口HashMap 的 forEach()

🎈总结


1 枚举背景及定义

枚举是在 JDK1.5 以后引入的。主要用途是:将一组常量组织起来,在这之前表示一组常量通常使用定义常量的方式:
public static final int RED = 1;
public static final int GREEN = 2;
public static final int BLACK = 3;
但是常量举例有不好的地方,例如:可能碰巧有个数字 1 ,但是他有可能误会为是 RED ,现在我们可以直接用枚举来进行组织,这样一来,就拥有了类型,枚举类型。而不是普通的整形1.
public enum EnumTest2 {RED,BLACK,GREEEN;
}
优点:将常量组织起来统一进行管理
场景:错误状态码,消息类型,颜色的划分,状态机等等 ....

本质:是 java.lang.Enum 的子类,也就是说,自己写的枚举类,就算没有显示的继承 Enum ,但是其默认继承了 这个类。

🚩使用

🎈、switch语句

package Enum;public enum EnumTest2 {RED,BLACK,GREEEN;public static void main(String[] args) {EnumTest2 enumTest2=EnumTest2.BLACK;switch (enumTest2){case RED:System.out.println("红色");break;case BLACK:System.out.println("黑色");break;case GREEEN:System.out.println("绿色");break;default:System.out.println("没有");}}
}

🎈、常用方法

Enum 类的常用方法
方法名称
描述
values()以数组形式返回枚举类型的所有成员
ordinal()获取枚举成员的索引位置
valueOf()将普通字符串转换为枚举实例
compareTo()比较两个枚举成员在定义时的顺序
 EnumTest2[] enumTest2s=EnumTest2.values();//以数组形式返回枚举类型的所有成员for (int i = 0; i <enumTest2s.length ; i++) {System.out.println(enumTest2s[i]+"  "+enumTest2s[i].ordinal());//获取枚举成员的索引位置}EnumTest2 c=EnumTest2.valueOf("BLACK");//valueOf() 将普通字符串转换为枚举实例System.out.println(c);System.out.println(RED.compareTo(BLACK));// //compareTo() 比较两个枚举成员在定义时的顺序  RED 0  BLACK 1 所以返回-1

拿到枚举实例
    public static void main(String[] args) {
//拿到枚举实例BLACKEnumTest2 testEnum = EnumTest2.BLACK;
//拿到枚举实例REDEnumTest2 testEnum21 = EnumTest2.RED;System.out.println(testEnum.compareTo(testEnum21));System.out.println(BLACK.compareTo(RED));System.out.println(RED.compareTo(BLACK));}

刚刚说过,在Java当中枚举实际上就是一个类。所以我们在定义枚举的时候,还可以这样定义和使用枚举:


🎈.构造方法

重要:枚举的构造方法默认是私有的

  • 1、当枚举对象有参数后,需要提供相应的构造函数
  • 2、枚举的构造函数默认是私有的 这个一定要记住
public enum EnumTest2 {RED(1,"红色"),BLACK(2,"黑色"),GREEEN(3,"绿色");private int ordinal;private String color;private EnumTest2(int ordinal, String color) {this.ordinal = ordinal;this.color = color;}
}

因为RED其实是枚举类里的对象。

运用:

public enum EnumTest2 {RED(1,"红色"),BLACK(2,"黑色"),GREEEN(3,"绿色");private int ordinal;private String color;private EnumTest2(int ordinal, String color) {this.ordinal = ordinal;this.color = color;}public static EnumTest2 getEnumKey(int ordinal){for(EnumTest2 t:EnumTest2.values()){//前面是每个类对象,后面以数组形式返回枚举类型的所有成员if(ordinal==t.ordinal){return t;}}return null;}public static void main(String[] args) {System.out.println(getEnumKey(2));}
}

2. Lambda表达式

🚩背景

Lambda 表达式是 Java SE 8 中一个重要的新特性。 lambda 表达式允许你通过表达式来代替功能接口。 lambda 表达式就和方法一样, 它提供了一个正常的参数列表和一个使用这些参数的主体 (body, 可以是一个表达式或一个代码块) Lambda 表达式( Lambda expression ,基于数学中的 λ 演算得名,也可称为闭包( Closure ) 。

🎈Lambda表达式的语法

基本语法: (parameters) -> expression (parameters) ->{ statements; }

parameters-范围  expression-表达

Lambda表达式由三部分组成:
  • 1. paramaters:类似方法中的形参列表,这里的参数是函数式接口里的参数。这里的参数类型可以明确的声明也可不声明而由JVM隐含的推断。另外当只有一个推断类型时可以省略掉圆括号。
  • 2. ->:可理解为被用于的意思
  • 3. 方法体:可以是表达式也可以代码块,是函数式接口里方法的实现。代码块可返回一个值或者什么都不返回,这里的代码块块等同于方法的方法体。如果是表达式,也可以返回一个值或者什么都不返回。
// 1. 不需要参数,返回值为 2
() -> 2// 2. 接收一个参数(数字类型),返回其2倍的值
x -> 2 * x// 3. 接受2个参数(数字),并返回他们的和
(x, y) -> x + y// 4. 接收2个int型整数,返回他们的乘积
(int x, int y) -> x * y// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
(String s) -> System.out.print(s)

🌈函数式接口

要了解 Lambda 表达式 , 首先需要了解什么是函数式接口,函数式接口定义: 一个接口有且只有一个抽象方法 。
注意:
  • 1. 如果一个接口只有一个抽象方法,那么该接口就是一个函数式接口
  • 2. 如果我们在某个接口上声明了 @FunctionalInterface 注解,那么编译器就会按照函数式接口的定义来要求该接口,这样如果有两个抽象方法,程序编译就会报错的。所以,从某种意义上来说,只要你保证你的接口中只有一个抽象方法,你可以不加这个注解。加上就会自动进行检测的。
  • 定义方式:
//函数式接口
@FunctionalInterface
interface NoParameterNoReturn1{//注意只能一个方法void test();
}

如果声明了@FunctionalInterface,那么就不能定义俩个抽象方法。

但是这种方式也是可以的:

🌈Lambda表达式的基本使用

首先,我们实现准备好几个接口:
//无返回值无参数
@FunctionalInterface
interface NoParameterNoReturn {
void test();
}
//无返回值一个参数
@FunctionalInterface
interface OneParameterNoReturn {
void test(int a);
}
//无返回值多个参数
@FunctionalInterface
interface MoreParameterNoReturn {
void test(int a,int b);
}
//有返回值无参数
@FunctionalInterface
interface NoParameterReturn {
int test();
}
//有返回值一个参数
@FunctionalInterface
interface OneParameterReturn {
int test(int a);
}
//有返回值多参数
@FunctionalInterface
interface MoreParameterReturn {
int test(int a,int b);
}
我们在上面提到过, Lambda 可以理解为: Lambda 就是匿名内部类的简化,实际上是创建了一个类,实现了接口,重写了接口的方法 。

❗无参无返回值
没有使用lambda表达式的时候的调用方式 (无参无返回值):

我们就按第一个 无返回值无参数的调用。

  @FunctionalInterface
interface NoParameterNoReturn {void test();
}public static void main(String[] args) {NoParameterNoReturn noParameterNoReturn=new NoParameterNoReturn() {@Overridepublic void test() {System.out.println("这是一个无参无返回值的接口");}};//相当于重写了这个类的test方法noParameterNoReturn.test();}

有使用lambda表达式的时候的调用方式 (无参无返回值):

        NoParameterNoReturn noParameterNoReturn1=()->{System.out.println("无返回值无参数的 ()->{}");};noParameterNoReturn1.test();


❗无返回值一个参数
 //无返回值一个参数OneParameterNoReturn oneParameterNoReturn=(a)->{System.out.println(a+10);};oneParameterNoReturn.test(20);
❗无返回值一个参数
 无返回值多个参数MoreParameterNoReturn moreParameterNoReturn=(a,b)->{System.out.println(a*b);};moreParameterNoReturn.test(10,20);
❗有返回值无参数
//有返回值无参数NoParameterReturn noParameterReturn=()->{System.out.println("有返回值无参数");return 10;};System.out.println(noParameterReturn.test());
❗有返回值一个参数
  OneParameterReturn oneParameterReturn=(a)->{return a;};System.out.println(oneParameterReturn.test(10));
❗有返回值多参数
     //有返回值多参数MoreParameterReturn moreParameterReturn=(a,b)->{return a+b;};System.out.println(moreParameterReturn.test(10, 20));

  • 1. 参数类型可以省略,如果需要省略,每个参数的类型都要省略。

  • 2. 参数的小括号里面只有一个参数,那么小括号可以省略

  • 3. 如果方法体当中只有一句代码,那么大括号可以省略
  • 4. 如果方法体中只有一条语句,且是return语句,那么大括号可以省略,且去掉return关键字。


🎈Lambda在集合当中的使用

为了能够让 Lambda Java 的集合类集更好的一起使用,集合当中,也新增了部分接口,以便与 Lambda 表达式对接。
对应的接
新增的方法
CollectionremoveIf() spliterator() stream() parallelStream() forEach()
ListreplaceAll() sort()
Map
getOrDefault()  forEach()   replaceAll()   putIfAbsent()   remove() replace()    computeIfAbsent()   computeIfPresent()   compute() merge()
以上方法的作用可自行查看我们发的帮助手册。我们这里会示例一些方法的使用。注意: Collection forEach() 方法是从接口 java.lang.Iterable 拿过来的。

🌈Collection接口 forEach() 方法演示

该方法在接口 Iterable 当中,原型如下:
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);for (T t : this) {action.accept(t);}
}

该方法表示:对容器中的每个元素执行action指定的动作 。

   public static void main(String[] args) {ArrayList<String> arrayList=new ArrayList<>();arrayList.add("chenle");arrayList.add("love");arrayList.add("zhangyaunfei");arrayList.forEach(new Consumer<String>() {@Overridepublic void accept(String s) {System.out.print(s+" ");}});}

但是如果利用Lambda表达式,代码就会变得很简单

arrayList.forEach(s->{System.out.print(s+"  ");});


🌈List接口 sort()方法的演示

sort 方法源码:该方法根据 c 指定的比较规则对容器元素进行排序。
arrayList.sort(new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {//这里比较的是长度return o1.length()-o2.length();}});System.out.println(arrayList);

但是如果利用Lambda表达式,代码就会变得很简单

  arrayList.sort((o1,o2)->o1.length()-o2.length());System.out.println(arrayList);


🌈Map接口HashMap forEach()

作用是对Map中的每个映射执行action指定的操作。

    public static void main(String[] args) {HashMap<String,Integer>hashMap=new HashMap<>();hashMap.put("chenle",2);hashMap.put("zhangyaunfei",3);hashMap.put("cl",4);hashMap.forEach(new BiConsumer<String, Integer>() {@Overridepublic void accept(String s, Integer integer) {System.out.println(s+"  "+integer);}});}

用Lambda表达式可以

 hashMap.forEach((k,v)-> System.out.println(k+"  "+v));


🎈总结

Lambda表达式的优点很明显,在代码层次上来说,使代码变得非常的简洁。缺点也很明显,代码不易读。

优点:
  • 1. 代码简洁,开发迅速
  • 2. 方便函数式编程
  • 3. 非常容易进行并行计算
  • 4. Java 引入 Lambda,改善了集合操作
缺点:
  • 1. 代码可读性变差
  • 2. 在非并行计算中,很多计算未必有传统的 for 性能要高
  • 3. 不容易进行调试

阶段性学习尾声了。

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

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

相关文章

网安面试(协议篇)

动态路由协议的功能? 动态路由协议的功能是根据网络中实际情况动态地选择路由路径&#xff0c;以保证数据包能够快速、准确地到达目的地。常见的动态路由协议有OSPF、EIGRP、BGP等。 一次完整的http请求过程? 1. 客户端进行DNS域名解析&#xff0c;得到对应的IP地址 2. 根…

RabbitMQ使用

目录 初识MQ 同步通讯和异步通讯​编辑 同步通讯 同步调用存在的问题 总结 同步调用优点&#xff1a; 同步调用的问题&#xff1a; 异步通讯 事件驱动优势 总结 什么是MQ RabbitMQ快速入门 RabbitMQ概述和安装 RabbitMQ结构和概念​编辑 总结 常见消息模型 不同…

基于springboot+vue的旅游管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

基于YOLOv5的驾驶员疲劳驾驶行为​​​​​​​检测系统

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文主要内容:详细介绍了疲劳驾驶行为检测整个过程&#xff0c;从数据集到训练模型到结果可视化分析。 博主简介 AI小怪兽&#xff0c;YOLO骨灰级玩家&#xff0c;1&#xff09;YOLOv5、v7、v8优化创新&#xff0c;轻松涨点和模型轻量…

MongoDB聚合运算符:$dateTrunc

聚合运算符$dateTrunc用于将日期字段的时间部分截断到指定的单位。 $dateTrunc 可以用于以下场景&#xff1a; 按指定的时间单位对日期进行截断&#xff1a;这意味着可以将日期字段舍入到最近的单位&#xff0c;如天、小时、分钟等。例如&#xff0c;将所有记录舍入到最近的小…

xtrabackup-docker实战

xtrabackup 引言 案例代码可以从https://github.com/WeiXiao-Hyy/k8s_example获取&#xff0c;欢迎Star&#xff01; 环境准备 创建数据文件夹和备份文件夹 mkdir -p ~/GitCode/xtrabackup/mysql/data mkdir -p ~/GitCode/xtrabackup/mysql/backup制作MySQL:5.7运行环境 …

Spring事务注解@Transactional的流程和源码分析

Spring事务简介 Spring事务有两种方式&#xff1a; 编程式事务&#xff1a;编程式事务通常使用编程式事务管理API实现&#xff0c;比如Spring提供的PlatformTransactionManager接口&#xff0c;使用它操控事务。声明式事务&#xff1a;注解式事务使用AOP&#xff08;面向切面…

字符串匹配问题(strs)

作者 刘昆 单位 中国矿业大学徐海学院 字符串中只含有括号 (),[],<>,{},判断输入的字符串中括号是否匹配。如果括号有互相包含的形式&#xff0c;从内到外必须是<>,(),[],{}&#xff0c;例如。输入: [()] 输出 YES&#xff0c;而输入([])&#xff0c;([)]都应该输…

通过Dockerfile创建镜像

通过Dockerfile创建镜像 Docker 提供了一种更便捷的方式&#xff0c;叫作 Dockerfile docker build命令用于根据给定的Dockerfile构建Docker镜像。 docker build语法&#xff1a; # docker build [OPTIONS] <PATH | URL | -> 1. 常用选项说明--build-arg&#xff0c;设置…

Java学习笔记------内部类

类的五大成员 属性、方法、构造方法、代码块、内部类 内部类 格式&#xff1a; public class Outer{//外部类 public class Inner{//内部类 } } public class Test{//外部其他类 public static void main(String[] args) } inner类表示的事物是Outer类的一部分&#xf…

Python时间模块

Python语言的time模块&#xff1a;提供获取操作系统时间的相关命令 时间的表示方法 时间戳 从1970.1.1 0.0.0到当前时间点经历的秒数UTC &#xff08;世界协调时间&#xff09; 以英国格林威治这个城市所在的经度点为0时时区&#xff0c;向东或者向西每15度为1个时区&#xf…

数据库设计的三大范式理解与应用

数据库设计的三大范式是关系型数据库设计的基本原则&#xff0c;它们分别是&#xff1a;第一范式&#xff08;1NF&#xff09;&#xff1a;确保数据库表的每一列都是不可分割的基本数据项&#xff0c;即表中的所有字段值都是不可再分的原子值。这个范式的主要目的是确保每一个字…

【计算机考研】考408,还是不考408性价比高?

首先综合考虑&#xff0c;如果其他科目并不是很优秀&#xff0c;需要我们花一定的时间去复习&#xff0c;408的性价比就不高&#xff0c;各个科目的时间互相挤压&#xff0c;如果备考时间不充裕&#xff0c;考虑其他专业课也未尝不可。 复习408本来就是费力不讨好的事情 不同…

公司项目总结合分享经验

珠海督办 1.批量导入 导入excel表单给接口&#xff0c;接口返回前端想要的数据 list是代表数据的数量&#xff0c;titleMap是代表数据中会有那些字段 listl里面的字段&#xff1a; value是代表要显示的值&#xff0c;success为true代表excel表格的内容填写是正确的&#…

前端布局方式及其优缺点

前端布局方式多种多样&#xff0c;每种布局方式都有其特定的应用场景、特性和优缺点。以下是一些常见的前端布局方式及其特点和优缺点&#xff1a; 静态布局&#xff1a; 特性&#xff1a;元素的尺寸使用绝对单位&#xff08;如px&#xff09;进行定义&#xff0c;不会随浏览器…

代码随想录训练营第三十期|第五十三天|动态规划part14|● 1143.最长公共子序列 ● 1035.不相交的线 ● 53. 最大子序和 动态规划

1143. 最长公共子序列 - 力扣&#xff08;LeetCode&#xff09; class Solution {public int longestCommonSubsequence(String text1, String text2) {int[][] dp new int[text1.length() 1][text2.length() 1];dp[0][0] 0;for (int i 1; i < text1.length(); i) {ch…

1.5 简述转置卷积的主要思想以及应用场景

1.5 简述转置卷积的主要思想以及应用场景 普通的卷积主要思想&#xff1a; 普通的卷积操作可以形式化为一个矩阵乘法运算&#xff0c;即yAx&#xff08;1-12&#xff09; 其中&#xff0c;x和y分别是卷积的输入和输出(展平成一维向量形式)&#xff0c;维度分别为d⁽i⁾和d⁽…

Linux:kubernetes(k8s)探针ReadinessProbe的使用(9)

本章yaml文件是根据之前文章迭代修改过来的 先将之前的pod删除&#xff0c;然后使用下面这个yaml进行生成pod apiVersion: v1 # api文档版本 kind: Pod # 资源对象类型 metadata: # pod相关的元数据&#xff0c;用于描述pod的数据name: nginx-po # pod名称labels: # pod的标…

第三百八十八回

文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了DateRangePickerDialog Widget相关的内容,本章回中将介绍Radio Widget.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在这里说的Radio Widget是指单选按钮&#xff0c;没有选中时是圆形边框&#x…

Vue+SpringBoot打造超市账单管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统设计3.1 总体设计3.2 前端设计3.3 后端设计在这里插入图片描述 四、系统展示五、核心代码5.1 查询供应商5.2 查询商品5.3 新增超市账单5.4 编辑超市账单5.5 查询超市账单 六、免责说明 一、摘要 1.1 项目介绍 基于…