数据结构--反射,枚举,lambda表达式

news2024/11/28 12:01:15

目录

  • 一.反射
    • 1.1 概念
    • 1.2 反射相关类
    • 1.3 反射常用方法
    • 1.4 获取Class对象
    • 1.5 反射的优缺点
  • 二.枚举
    • 2.1 概念
    • 2.2 枚举的简单使用
    • 2.3 枚举常用方法
    • 2.4 枚举优缺点
  • 三.lambda表达式
    • 3.1 概念
    • 3.2 基本语法
    • 3.3 lambda表达式的简单使用
    • 3.4 变量捕获
    • 3.5 lambda表达式优缺点

一.反射

1.1 概念

在运行状态中,对于任意一个类都能知道这个类的所有属性和方法,对于任意一个对象都能够调用它的任意方法和属性,这种动态获取信息以及动态调用对象方法的功能称为反射机制

1.2 反射相关类

  • Class类:代表类的实体,在运行的Java应用程序中表示类和接口
  • Field类:代表类的成员变量/类的属性
  • Method类:代表类的方法
  • Constructor类:代表类的构造方法

1.3 反射常用方法

  • 获得类相关的方法
方法用途
getClassLoader()获得类的加载器
getDeclaredClasses()返回一个数组,数组中包含该类中所有类和接口类的对象(包括私有的)
forName(String className)根据类名返回类的对象
newInstance()创建类的实例
getName()获得类的完整路径名字
  • 获得类中属性(与Field相关)
方法用途
getField(String name)获得某个公有的属性对象
getFields()获得所有公有的对象
getDeclaredField(String name)获得某个属性对象
getDeclaredFields()获得所有属性对象
  • 获得类中方法(与Method相关)
方法用途
getMethod(String name,Class…<?> parameterTypes)获得该类某个公有的方法
getMethods()获得该类所有公有的方法
getDeclaredMethod(String name,Class…<?> parameterTypes)获得该类某个方法
getDeclaredMethods()获得该类所有方法
  • 获得类中构造器(与Constructor相关)
方法用途
getConstructor(Class…<?> parameterTypes)获得该类中与参数类型匹配的公有构造方法
getConstructor()获得该类的所有公有构造方法
getDeclaredConstructor(Class…<?> parameterTypes)获得该类中与参数类型匹配的构造方法
getDeclaredConstructors()获得该类所有构造方法
  • 获得类中注解
方法用途
getAnnotation(Class annotationClass)返回该类中与参数类型匹配的公有注解对象
getAnnotations()返回该类所有的公有注解对象
getDeclaredAnnotation(Class annotationClass)返回该类中与参数类型匹配的所有注解对象
getDeclaredAnnotations()返回该类所有的注解对象

1.4 获取Class对象

在进行反射之前,需要先获取到需要反射的类的Class对象,然后通过Class对象的核心方法,达到反射的目的。获取Class对象的方法大致有三种(获取到的Class对象都是同一个):

  1. 使用Class.forName("类的全路径名")
    try {
        Class class1 = Class.forName("Student");
    } catch (ClassNotFoundException e) {
        throw new RuntimeException(e);
    }
  1. 使用.class方法
  Class class2 = Student.class;
  1. 使用类对象的getClass()方法
    Student stu = new Student();
    Class class3 = stu.getClass();

1.5 反射的优缺点

优点:

  • 对于一个任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法
  • 增加程序的灵活性拓展性,降低耦合性,提高自适应能力
  • 反射已经运用在很多框架中,如Spring等等

缺点:

  • 使用反射会出现效率问题,导致程序效率降低
  • 反射技术绕过了源代码技术,会带来维护问题

二.枚举

2.1 概念

在Java中,当需要表示一组常量时,可能会采用逐个定义的方法,但有时又过于繁琐,这时我们就可以使用枚举类型,将一组常量组织起来

2.2 枚举的简单使用

enum Color {
    COLOR_RED(1, "red"), COLOR_BLUE(2, "blue"), COLOR_GREEN(3, "green");

    int key;
    String color;

    //枚举的构造方法默认是私有的
    private Color(int key, String color) {
        this.key = key;
        this.color = color;
    }
}

public class TestEnum {
    public static void main(String[] args) {
        Color color = Color.COLOR_BLUE;
        System.out.println(color.key);
    }
}

2.3 枚举常用方法

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

2.4 枚举优缺点

优点:

  • 枚举常量更简单安全
  • 枚举具有内置方法,使用更方便
  • 枚举可以避免反射序列化问题

缺点:

  • 不可继承,无法拓展

三.lambda表达式

3.1 概念

lambda表达式通过提供一个正常的参数列表和一个使用这些参数的主体来代替功能接口

3.2 基本语法

lambda表达式的基本语法:(parameters) -> (expression)(parameters) -> { statements; }

  • parameters:类似方法中的形参列表,这里的参数是函数式接口(有且只有一个抽象方法的接口)里的参数,可以明确声明类型或者不声明类型让JVM去推断;当只有一个推断类型时可以省略掉括号
  • 箭头 ->:可以理解为被用于
  • 方法体:可以是表达式也可以是代码块,是函数式接口里方法的实现。如果是代码块,可以返回一个值或者什么都不返回(代码块等同于方法的方法体);如果是表达式,也是返回一个值或者什么都不返回

3.3 lambda表达式的简单使用

// 添加@FunctionalInterface注解后,编译器就会按照函数式接口的定义来要求该接口
// 如果有两个抽象方法,程序编译就会报错的
@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);
}

public class TestLambda {
    public static void main(String[] args) {
        NoParameterNoReturn noParameterNoReturn = () -> System.out.println("无返回值无参数");
        noParameterNoReturn.test();
        OneParameterNoReturn oneParameterNoReturn = a -> System.out.println(a + 1);
        oneParameterNoReturn.test(10);
        MoreParameterNoReturn moreParameterNoReturn = (a, b) -> System.out.println(a + b);
        moreParameterNoReturn.test(10, 20);
        NoParameterReturn noParameterReturn = () -> 1;
        System.out.println(noParameterReturn.test());
        OneParameterReturn oneParameterReturn = a -> a + 1;
        System.out.println(oneParameterReturn.test(3));
        MoreParameterReturn moreParameterReturn = (a, b) -> a + b;
        System.out.println(moreParameterReturn.test(4, 5));
    }
}

3.4 变量捕获

在匿名内部类中捕获的变量只能是常量没有修改过的变量,同样,对于lambda表达式也是如此

class InnerClass {
    public void func() {
        System.out.println("hello");
    }
}

interface InterfaceLambda {
    void func();
}

public class TestStatic {
    public static void main(String[] args) {
        int a = 100;
        InnerClass innerClass = new InnerClass() { //匿名内部类
            @Override
            public void func() {
                //a = 10; 在匿名内部类中无法捕获修改过的变量
                System.out.println("hello world");
            }
        };
        InterfaceLambda interfaceLambda = () -> {
            // a = 10; 在lambda表达式中同样无法捕获修改过的变量
            System.out.println("hello");
        };
    }
}

3.5 lambda表达式优缺点

优点:

  • 代码简介,开发迅速
  • 方便函数式编程
  • 非常容易进行并行计算
  • java引入lambda表达式,改善了集合操作

缺点:

  • 代码可读性变差
  • 在非并行计算中,很多计算可能没有for的性能高
  • 不容易进行调试

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

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

相关文章

图书系统小案例

目前就实现了分页查询&#xff0c;修改&#xff0c;删除功能 这个小案例练习到了很多技能&#xff0c;比如前后端交互、异步请求、三层架构思想、后端连接数据库、配置文件、基础业务crud等等 感兴趣的小伙伴可以去做一个试试 准备工作 1、使用maven构建一个web工程 打开i…

深度理解进程的概念(Linux)

目录 一、冯诺依曼体系 二、操作系统(OS) 设计操作系统的目的 核心功能 系统调用 三、进程的概念与基本操作 简介 查看进程 通过系统调用获取进程标识符 通过系统调用创建进程——fork() 四、进程的状态 操作系统中的运行、阻塞和挂起 理解linux内核链表 Linux的进…

自媒体图文视频自动生成软件|03| 页面和结构介绍

代码获取方式在文本末尾&#x1f51a; *代码获取方式在文本末尾&#x1f51a; *代码获取方式在文本末尾&#x1f51a; *代码获取方式在文本末尾&#x1f51a; 视频图片生成器 一个基于 Python 和 Web 的工具&#xff0c;用于生成带有文字和语音的视频以及图片。支持多种尺寸、…

STM32的一些知识技巧

STM32的一些知识技巧 STM32命名规则 查看代码编译所占用的flash和SRAM的大小 单位为字节&#xff08;Byte&#xff09; 1、使用keil编译结果进行计算 2、查看.map文件 STM32启动模式 主闪存启动地址为0x08000000 查看程序段/函数执行时间 global.prop文件 保存字体配置&…

我们来学mysql -- EXPLAIN之rows(原理篇)

EXPLAIN之rows 题记rows 题记 书接上文《 EXPLAIN之ref》2024美国大选已定&#xff0c;川普剑登上铁王座&#xff0c;在此过程中出谋划策的幕僚很重要&#xff0c;是他们决定了最终的执行计划在《查询成本之索引选择》中提到&#xff0c;explain的输出&#xff0c;就是优化器&…

【AI系统】昇腾 AI 核心单元

昇腾 AI 核心单元 本文将深入介绍昇腾 AI 处理器的核心单元——AI Core&#xff0c;以及其背后的达芬奇架构。昇腾 AI 处理器是华为针对 AI 领域设计的专用处理器&#xff0c;其核心 AI Core 采用了特定域架构&#xff08;Domain Specific Architecture&#xff0c;DSA&#x…

Hadoop生态圈框架部署(九)- Hive部署

文章目录 前言一、Hive部署&#xff08;手动部署&#xff09;下载Hive1. 上传安装包2. 解压Hive安装包2.1 解压2.2 重命名2.3 解决guava冲突 3. 配置Hive3.1 配置Hive环境变量3.2 修改 hive-site.xml 配置文件3.3 配置MySQL驱动包3.3.1 下在MySQL驱动包3.3.2 上传MySQL驱动包3.…

RHCE——SELinux

SELinux 什么是SELinux呢&#xff1f;其实它是【Security-Enhanced Linux】的英文缩写&#xff0c;字母上的意思就是安全强化Linux的意思。 SELinux是由美国国家安全局(NSA)开发的&#xff0c;当初开发的原因是很多企业发现&#xff0c;系统出现问题的原因大部分都在于【内部…

Vue3的通灵之术Teleport

前言 近期Vue3更新了一些新的内容&#xff0c;我都还没有一个一个仔细去看&#xff0c;但是还是有必要去解读一下新内容的。就先从Teleport 开始吧。 官方对 Teleport 的解释是&#xff1a;<Teleport> 是一个内置组件&#xff0c;它可以将一个组件内部的一部分模板“传…

介绍一下atof(arr);(c基础)

hi , I am 36 适合对象c语言初学者 atof(arr)&#xff1b;是返回浮点数(double型)&#xff0c;浮点数数是arr数组中字符中数字 格式 #include<stdio.h> atof(arr); 返回值arr数组中的数 未改变arr数组 #include<stdio.h> //atof(arr) 返 <stdlib> int…

STM32 USART配置库函数

单片机学习&#xff01; 目录 一、USART配置函数 1.1 USART_DeInit函数 1.2 USART_Init函数 1.3 USART_StructInit函数 二、配置同步时钟输出函数 2.1 USART_ClockInit函数 2.2 USART_ClockStructInit函数 三、USART的外设与中断函数 3.1 USART_Cmd函数 3.2 USART_IT…

通俗理解人工智能、机器学习和深度学习的关系

最近几年人工智能成为极其热门的概念和话题&#xff0c;可以说彻底出圈了。但人工智能的概念在1955年就提出来了&#xff0c;可以说非常古老。我在上小学的时候《科学》课本上就有人工智能的概念介绍&#xff0c;至今还有印象&#xff0c;但那些年AI正处于“寒冬”&#xff0c;…

2024数学建模亚太赛【C题】赛题详细解析

目录 &#x1f4d1;一、竞赛时间 &#x1f5dd;️二、奖项设置 ✏️三、选题思路 &#x1f50d;阶段一&#xff1a;【数据预处理与探索性分析】 1.【数据清洗与预处理】 2.【探索性数据分析&#xff08;EDA&#xff09;】 &#x1f50d;阶段二&#xff1a;【时间序列建模…

数据结构 【堆实现】

上文提到堆是一种特殊的二叉树&#xff0c;其中它的父结点均不大于或者不小于其子结点的值。堆总是一棵完全二叉树。其中&#xff0c;堆的父节点全部不小于它的子结点时称为大堆&#xff0c;堆的父结点全部不大于其子结点的堆称为小堆。 堆可以由两种结构来实现&#xff0c;分别…

【AI绘画】Midjourney进阶:色调详解(下)

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AI绘画 | Midjourney 文章目录 &#x1f4af;前言&#x1f4af;Midjourney中的色彩控制为什么要控制色彩&#xff1f;为什么要在Midjourney中控制色彩&#xff1f; &#x1f4af;色调纯色调灰色调暗色调 &#x1f4af…

[代码随想录Day24打卡] 93.复原IP地址 78.子集 90.子集II

93.复原IP地址 一个合法的IP地址是什么样的&#xff1a; 有3个’.分割得到4个数&#xff0c;每个数第一个数不能是0&#xff0c;不能含有非法字符&#xff0c;不能大于255。 这个是否属于合法IP相当于一个分割问题&#xff0c;把一串字符串分割成4部分&#xff0c;分别判断每…

“harmony”整合不同平台的单细胞数据之旅

其实在Seurat v3官方网站的Vignettes中就曾见过该算法&#xff0c;但并没有太多关注&#xff0c;直到看了北大张泽民团队在2019年10月31日发表于Cell的《Landscap and Dynamics of Single Immune Cells in Hepatocellular Carcinoma》&#xff0c;为了同时整合两类数据&#xf…

贴代码PasteForm框架之框架核心帮助类PasteFormHelper说明

简介 PasteForm是贴代码推出的 “新一代CRUD” &#xff0c;基于ABPvNext&#xff0c;目的是通过对Dto的特性的标注&#xff0c;从而实现管理端的统一UI&#xff0c;借助于配套的PasteBuilder代码生成器&#xff0c;你可以快速的为自己的项目构建后台管理端&#xff01;目前管…

杂7杂8学一点之ZC序列

重要的放在前面&#xff0c;优秀文章链接&#xff1a;5GNR漫谈13&#xff1a;Zadoff –Chu&#xff08;ZC&#xff09;序列性质 目录 1. ZC序列 1.1 ZC序列的表达式 1.2 ZC序列的特点 2. PRACH中的ZC序列 2.1 为什么要有逻辑根序列与物理根序列的概念 1. ZC序列 ZC序列&…

matlab代码--卷积神经网络的手写数字识别

1.cnn介绍 卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09;是一种深度学习的算法&#xff0c;在图像和视频识别、图像分类、自然语言处理等领域有着广泛的应用。CNN的基本结构包括输入层、卷积层、池化层&#xff08;Pooling Layer&#xff09;、全连…