java——枚举,lambda

news2025/9/18 19:27:05

文章目录

  • 枚举的使用
    • 使用场景
      • switch语句
      • 常用方法
  • lambda
    • lambda的前置知识
      • 什么是函数式接口
    • lambda的基本语法
    • lambda注意事项

枚举的使用

枚举是在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 TestEnum {
RED,BLACK,GREEN;
}

使用场景

switch语句

public static void main(String[] args) {
        TestEnum[] ne=TestEnum.values();
        TestEnum pe=null;
        for(int i=0;i<3;i++){
            pe=ne[i/2];
            switch (pe){
                case RED:
                    System.out.println("Red");
                    break;
                case BLACK:
                    System.out.println("BLACK");
                    break;
                case GREEN:
                    System.out.println("GREEN");
                    break;
                default:
                    System.out.println("ERROR");
            }
        }

在我们未来如果要写日志的话那么使用枚举类和switch语句进行配合是非常方便的

常用方法

方法作用
values()以数组的形式返回枚举类型的所有成员
ordia()获取枚举成员的索引位置
valueOf()将普通字符串转换为枚举实例
compareTo()比较两个枚举成员在定义时的顺序

那么用代码给大家来进行一下代码示例吧

 public static void main(String[] args) {
        TestEnum[] ne=TestEnum.values();
        for(int i=0;i<ne.length;i++){
            System.out.printf("%s ",ne[i]);
            System.out.println(ne[i].ordinal());
        }
    }

从这个代码可以看出values这个方法可以使其以数组形式返回因为我们发现我们可以用数组的形式去遍历,其次我们也可以看出ordinal可以打印出该元素所代表的下标是多少
在这里插入图片描述
那么有些同学可能会疑惑几个地方,首先就是为什么枚举类型我们没有实现方法,但是却可以调用这些方法呢?答案只有一个那就是这些方法不是枚举实现的,那么是谁呢?是他的父类,也就是object类实现的。
然后有些同学可能还有一个疑惑那就是发现自己的枚举类型不能去new一个对象,这让人搞不懂为什么不能new呢?因为枚举中的构造函数默认是私有的,这时候有些同学可能就有歪点子了会想既然枚举的构造是私有的不能调用那我就用反射去搞,这样可不可以呢?答案是不行的java做的有特殊处理枚举是不能通过反射去调用构造函数的,因此我们未来用java实现一个单列模式其实用的就是枚举
那么我们知道了这些后也就是说枚举是不可继承的并且还无法扩展

lambda

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

lambda的前置知识

什么是函数式接口

首先我们要明白什么是函数式接口呢?函数式接口意思就是这个接口中有且只有一个抽象方法 。

注意:

  1. 如果一个接口只有一个抽象方法,那么该接口就是一个函数式接口
  2. 如果我们在某个接口上声明了 @FunctionalInterface 注解,那么编译器就会按照函数式接口的定义来要求该接
    口,这样如果有两个抽象方法,程序编译就会报错的。所以,从某种意义上来说,只要你保证你的接口中只
    有一个抽象方法,你可以不加这个注解。加上就会自动进行检测的。

定义方式

@FunctionalInterface
interface NoParameterNoReturn {
//注意:只能有一个方法
void test();
}

但是下面这种方式也是可以的

interface NoParameterNoReturn {
void test();
default void test2() {
System.out.println("JDK1.8新特性,default默认方法可以有具体的实现");
}
}

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表达式这个函数式接口应该怎么实例化呢

 public static void main(String[] args) {
        NoParameterNoReturn ne1=new NoParameterNoReturn() {
            @Override
            public void test() {
                System.out.println("NoParameterNoReturn");
            }
        };
        ne1.test();
    }

那么使用lambda之后呢?

 public static void main(String[] args) {
        NoParameterNoReturn ne1=()->{System.out.println("NoParameterNoReturn");};
        ne1.test();
    }

我们可以很清楚的看到使用了lambda之后我们的代码量减少了很多
那么我们来解析一下首先lambda表达式中的这个括号表示的其实就是你要写的这个方法中的参数没有参数就不写这个是无参无返回值的写法我们来写一下有参有返回值的写法

 public static void main(String[] args) {
        NoParameterNoReturn ne1=()->{System.out.println("NoParameterNoReturn");};
        ne1.test();
        OneParameterReturn ne2=(int a)->{return a;};
        int b=ne2.test(10);
        System.out.println(b);
    }

这个是有一个参数有返回值的写法,其实写道这里我们应该会想起来一个东西那就是我们的优先级队列

public static void main(String[] args) {
        PriorityQueue<Integer>ne=new PriorityQueue<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1.compareTo(o2);
            }
        });
    }

我们的优先级队列在传入比较器的时候是不是也特别像是可以写成一个lambda的形式呢?我们来试试

public static void main(String[] args) {
        PriorityQueue<Integer>ne=new PriorityQueue<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1.compareTo(o2);
            }
        });
        //lambda写法
        PriorityQueue<Integer>ne2=new PriorityQueue<>((o1,o2)->{return o1.compareTo(o2);});
    }

那么很明显确实如此。由此我们可以知道lambda的用法了

lambda注意事项

我们的lambda可以使用外面定义的参数吗?答案是可以的例如下面的代码

    public static void main(String[] args) {
        int a=10;
        OneParameterReturn ne=(int b)->{
            System.out.println(a);
            return 10;
        };
        ne.test(20);
    }

在这里插入图片描述

这个代码的运行我们可以看到lambda是可以使用外面定义的变量的但是这里有个地方需要注意就是你要保证你使用的这个变量的值没有被修改过

public static void main(String[] args) {
        int a=10;
        a=20;
        OneParameterReturn ne=(int b)->{
            System.out.println(a);
            return 10;
        };
        ne.test(20);
    }

列如这样的代码就是报错的

 public static void main(String[] args) {
        int a=10;
        OneParameterReturn ne=(int b)->{
            a=30;
            System.out.println(a);
            return 10;
        };
        ne.test(20);
    }

这样也是不行的。

	开开心心的和你在一起生活哈哈哈

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

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

相关文章

OpenCV学习笔记(四)——对视频的读取操作

目录 读取视频内容 将彩色视频转换为灰色视频 读取视频内容 读取视频文件通常分为读取文件、验证是否打开成功打开文件、逐帧读取视频文件、释放资源和关闭窗口 &#xff08;1&#xff09;读取文件 在OpenCV中&#xff0c;通常使用VedioCapture来读取视频流&#xff0c;Vedi…

Vue.js数据绑定解密:深入探究v-model和v-bind的原理与应用

hello宝子们...我们是艾斯视觉擅长ui设计和前端开发10年经验&#xff01;希望我的分享能帮助到您&#xff01;如需帮助可以评论关注私信我们一起探讨&#xff01;致敬感谢感恩&#xff01; Vue.js数据绑定解密&#xff1a;深入探究v-model和v-bind的原理与应用 一、引言 Vue.…

OpenAI GPT LLMs 高级提示词工程方法汇总

原文地址&#xff1a;An Introduction to Prompt Engineering for OpenAI GPT LLMs Github&#xff1a;Prompt-Engineering-Intro 2023 年 3 月 2 日 Naive 提示词&#xff1a;带有提示的情感分类器 prompt Decide whether a Tweets sentiment is positive, neutral, or …

HashSet在添加元素时,是如何判断元素重复的?

前言&#xff1a;我们知道Set中所存储的元素是不重复的&#xff0c;那么Set接口的实现类HashSet在添加元素时是怎么避免重复的呢&#xff1f; HashSet在添加元素时&#xff0c;是如何判断元素重复的? ● 在底层会先调用hashCode()&#xff0c;注意&#xff0c;Obje…

anaconda问题合集

目录 一. 万分注意 二. ImportError: DLL load failed while importing _ctypes: 找不到指定的模块。 1. 发生情况 2. 导致结果和解决方法 三. WARNING: A newer version of conda exists. 1. 在conda install 某库的时候 2. 解决方法 一. 万分注意 不要轻易使用 conda …

英文版大宗现货商品挂牌交收系统

我们倾力打造了一款英文版大宗现货商品挂牌交收系统&#xff0c;旨在为全球贸易提供更为高效、便捷、安全的解决方案。 一、系统概述 英文版大宗现货商品挂牌交收系统是一款集商品信息发布、交易撮合、交收管理于一体的综合性平台。通过先进的互联网技术&#xff0c;我们实现…

JavaSE面试——Collection接口和Collections类

集合分为&#xff1a;Collection 和 Map 两个体系 java8为 Collection 的父接口( Iterable )提供了一个默认的 Foreach 方法&#xff0c;我们可以使用它进行集合遍历 1. Collection 接口 Collection接口是是Java集合类的顶级接口之一&#xff0c;Collection 接口有 3 种子类型…

海外媒体宣发套餐如何利用3种方式洞察市场-华媒舍

在当今数字化时代&#xff0c;媒体宣发成为了企业推广产品和品牌的重要手段之一。其中&#xff0c;7FT媒体宣发套餐是一种常用而有效的宣传方式。本文将介绍这种媒体宣发套餐&#xff0c;以及如何利用它来洞察市场。 一、关键概念 在深入讨论7FT媒体宣发套餐之前&#xff0c;让…

解决 matplotlib 中文显示乱码的问题

matplotlib 库默认只显示中文 例如&#xff1a; import matplotlib.pyplot as pltimg plt.imread(test.jpg)# plt.rcParams[font.sans-serif] [SimHei] # 用来正常显示中文标签 # plt.rcParams[axes.unicode_minus] False # 用来正常显示负号 #有中文出现的情况&#xf…

CrystalDiskInfo檢測機械硬盤黃色警告還能用嗎

下來看客戶寄來的這一顆日立1TB的舊硬碟。 ▲客戶的舊硬碟用CrystalDiskInfo檢測出現「05」黃色警告&#xff0c;這是什麼意思&#xff1f; 常見的黃色警告有三種&#xff1a;05、C5、C6 如果是05&#xff0c;硬碟通常還能用&#xff0c;但要非常小心&#xff0c;這一顆「很…

力扣589、590、102、107、429、199、637、515、116、117、104、111、226、101-Java刷题笔记

一、589. N 叉树的前序遍历 - 力扣&#xff08;LeetCode&#xff09; 1.1题目 给定一个 n 叉树的根节点 root &#xff0c;返回 其节点值的 前序遍历 。 n 叉树 在输入中按层序遍历进行序列化表示&#xff0c;每组子节点由空值 null 分隔&#xff08;请参见示例&#xff09…

微信小程序如何实现下拉刷新

1.首先在你需要实现下拉刷新页面的json文件中写入"enablePullDownRefresh": true。 2.在js文件的onPullDownRefresh() 事件中实现下拉刷新。 实现代码 onPullDownRefresh() {console.log(开始下拉刷新)wx.showNavigationBarLoading()//在标题栏中显示加载图标this.d…

《Graphis》杂志报道,凯毅文化斩获两项国际金奖

一、凯毅文化获美国Graphis 2024年度奖金奖   近日&#xff0c;收到美国《Graphis》团队邮件约稿&#xff0c;将对深圳凯毅文化获得Graphis年度金奖的作品《城市与自然》进行案例报道。在Graphis 2024年度奖项评选中&#xff0c;凯毅文化作品获得一项金奖&#xff0c;二项银奖…

指纹加密U盘/指纹KEY方案——采用金融级安全芯片 ACH512

方案概述 指纹加密U盘解决方案可实现指纹算法处理、数据安全加密、数据高速存取&#xff08;EMMC/TF卡/NandFlash&#xff09;&#xff0c;可有效保护用户数据安全。 方案特点 • 采用金融级安全芯片 ACH512 • 存储介质&#xff1a;EMMC、TF卡、NandFlash • 支持全系列国密…

七、门控循环单元语言模型(GRU)

门控循环单元&#xff08;Gated Recurrent Unit&#xff0c;GRU&#xff09;是 LSTM 的一个稍微简化的变体&#xff0c;通常能够提供同等的效果&#xff0c;并且计算训练的速度更快。 门控循环单元原理图&#xff1a;参考门控循环单元 原理图中各个图形含义&#xff1a; X(t)&a…

docker 运行异构镜像

概述 关于docker镜像在不同的cpu架构下运行报错的解决办法&#xff0c;作者踩坑验证&#xff0c;在此分享经验 某次工作遇到需要银行内部部署docker镜像&#xff0c;由于行内已经开始走信创的路线&#xff0c;使用鲲鹏系统&#xff0c;arm架构&#xff0c;记过就遇到了standa…

springboot整合shiro的实战教程(一)

文章目录 1.权限的管理1.1 什么是权限管理1.2 什么是身份认证1.3 什么是授权 2.什么是shiro3.shiro的核心架构3.1 Subject3.2 SecurityManager3.3 Authenticator3.4 Authorizer3.5 Realm3.6 SessionManager3.7 SessionDAO3.8 CacheManager3.9 Cryptography 4. shiro中的认证4.1…

LeetCode148题:排序链表(python3)

在数组排序中&#xff0c;常见的排序算法有&#xff1a;冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序等。 而对于链表排序而言&#xff0c;因为链表不支持随机访问&#xff0c;访问链表后面的节点只能依靠 next 指针从头…

P9238 [蓝桥杯 2023 省 A] 翻转硬币(杜教筛+莫比乌斯)

题目&#xff1a;https://www.luogu.com.cn/problem/P9238 思路&#xff1a; 代码&#xff1a; #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<string> #include<cstring> #include<cmath> #include<ctime> #include<algo…

从零开始手写RPC框架(4)

这一节主要讲述网络传输模块的代码&#xff0c;并且几乎每一行代码都加上了我个人理解的注释&#xff0c;同时也讲述了其中一些以前没见过的函数&#xff0c;和大致的底层运行逻辑。 目录 网络传输实体类网络传输实现基于Socket实现网络传输基于Netty实现网络传输客户端服务端 …