【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,一经查实,立即删除!

相关文章

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;轻松涨点和模型轻量…

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

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

通过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…

【计算机考研】考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;不会随浏览器…

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 项目介绍 基于…

王道机试C++第 3 章 排序与查找:排序问题 Day28(含二分查找)

查找 查找是另一类必须掌握的基础算法&#xff0c;它不仅会在机试中直接考查&#xff0c;而且是其他某些算法的基础。之所以将查找和排序放在一起讲&#xff0c;是因为二者有较强的联系。排序的重要意义之一便是帮助人们更加方便地进行查找。如果不对数据进行排序&#xff0c;…

【uni-app小程序开发】实现一个背景色渐变的滑动条slider

最近做的一个用uni-app+vue2开发的微信小程序项目中要实现一个滑动进度控制条,如下图所示: 1. 滑动条需要渐变背景色 2. 滑块的背景色需要与当前位置滑动条的背景色一致(动态改变) 碰到这样的需求,我当然先是看看官方提供的slider组件和uView里的u-slider组件能不能满足…

Javaweb之Web后端开发总结的详细解析

4. Web后端开发总结 到此基于SpringBoot进行web后端开发的相关知识我们已经学习完毕了。下面我们一起针对这段web课程做一个总结。 我们来回顾一下关于web后端开发&#xff0c;我们都学习了哪些内容&#xff0c;以及每一块知识&#xff0c;具体是属于哪个框架的。 web后端开…

nyist_acm 个人积分赛1(部分题解会补充)

Mirrored String II 看到题解说是马拉车算法&#xff0c;我赛时并没想到&#xff08;好吧其实我是比赛完才知道有马拉车这个算法&#xff09; 因为字符串的长度只有1000&#xff0c;直接暴力跑其实就可以了&#xff0c;但是要注意的是&#xff1b;回文串有俩种形式&#xff0c…

1. Gin框架入门

文章目录 一、Gin框架介绍二、RESTful API三、Gin渲染1. HTML渲染2. 自定义模板函数3. 静态文件处理4. 使用模板继承5. 补充文件路径处理6. JSON渲染7. XML渲染8. YMAL渲染9. protobuf渲染 四、Gin获取各种方式传递过来的参数1、获取querystring参数2、获取form参数3、获取path…

Vue3实现页面跳转功能

目标&#xff1a; 首页&#xff1a; 点击About后&#xff1a; 第一步&#xff1a;安装 Vue Router和创建你先 npm install vue-router4第二步&#xff1a;在router.js中设置路由 import { createRouter, createWebHistory } from vue-router; import Home from ./views/Home…

如何写一份简单的产品说明书,教程奉上

如果你是一位新晋产品经理&#xff0c;或者正在研发新产品&#xff0c;并且心中惴惴不安因为未知的产品说明书制作环节&#xff0c;那么今天你就来对地方了。本篇文章将教你如何创建一份简单明了的产品说明书。让我们开始吧&#xff01; 首先&#xff0c;明确产品说明书的目标。…