当前位置: 首页 > news >正文

数据类型自动转换的解决方案

数据类型自动转换的解决方案

java8、jdk8

背景

为方便测试框架数据处理以及方便查看一些数据,弄了一个工具类,部分要点简要说明。

主要涉及到字符串与其他类型的相互转换,无其他类型之间的相互转换。

轻量测试框架实现与使用的总篇可见此文。

问题分析

字符串转换为对象的方法(未完待续)

  • intInteger:判定int.class.equals(typeClass) || Integer.class.equals(typeClass)后,使用Integer.parseInt(str)方法;
  • booleanBoolean:判定boolean.class.equals(typeClass) || Boolean.class.equals(typeClass)
    后,使用Boolean.parseBoolean(toString(o))方法;
  • String:判定String.class.equals(typeClass)后,使用o.toString()方法;
  • List:判定List.class.isAssignableFrom(typeClass)后,去除前后缀,逗号分割后,将每个元素按照元素类型(参数传入)分别转换;
    • 元素类型:(Class<?>) ((ParameterizedType) typeClass.getGenericSuperclass()).getActualTypeArguments()[0]
  • Array:判定typeClass.isArray()后,利用List方法获得元素数组,然后根据元素类型,再次封装为相应对象:
    • 元素类型:typeClass.getComponentType()
    • int:手动创建int数组(int[]) Array.newInstance(int.class, list.size()),依次填入各元素;
    • Integer:使用List对象list.toArray(new Integer[0])方法创建;
    • String:使用List对象list.toArray(new String[0])方法创建;

对象转换为字符串的方法(未完待续)

  • Class对象:判定Class.class.equals(o.getClass())后,使用((Class<?>) o).getName()
    数组类型使用cls.getComponentType().getName() + "[]""表示
  • 基本类型数组或对象数组:判断o.getClass().isArray()后,使用o.getClass().getComponentType()获取元素类型,将对象强转为对应类型数组,
    • 对于封装对象类型,使用Arrays.stream(//强转的数组//).map(Convert::toString).collect(Collectors.joining(","))
    • 对于基本类型数组,使用String.join(",", Arrays.stream(//强转的数组//).mapToObj(Convert::toString).toArray(String[]::new))

注:int[]、String[]、Object[]等都可以处理,流处理中使用的Convert::toString方法,就是我对象转换为字符串方法的重载,能递归处理数组内各元素

  • List对象:判断o instanceof List后,使用((List<?>) o).toArray()转换为数组,然后使用上文处理数组的方法处理
  • 其他数据类型(基本数据类型):复杂数据类型条件筛选完后,基本数据类型使用String.valueOf(o)处理成字符串

解决方案

工具类源码大概如下(未完待续):

/*** 主要负责字符串型数据和各种类型对象的转换* <p>* 主要包括如下几类功能* 1. 字符串转成各类型对象的各方法* 2. 各类型对象转换成字符串的方法* 3. 按指定类型转换数据成相应对象的方法* 4. 按指定各种类型的列表,依次转换数据列表中的各数据,组装成相应对象列表的方法*/
public class Convert {/*** 按指定各元素类型的列表,依次转换数据列表中的各数据,组装成相应对象列表** @param typesClass 类型的Class列表* @param params     数据字符串列表* @return 对象列表* @throws Exception 类型列表和数据列表为空或长度不一致时,抛出异常中止运行*/public static Object[] toInstances(Class<?>[] typesClass, String[] params) throws Exception {if (null == typesClass || null == params) {throw new Exception("实参列表或形参类型列表为空!");} else if (typesClass.length != params.length) {throw new Exception("实参列表(" + params.length + ")参数类型列表(" + typesClass.length + ")长度不一致!");}Object[] ans = new Object[typesClass.length];for (int i = 0; i < typesClass.length; i++) {ans[i] = toInstance(typesClass[i], params[i]);}return ans;}/*** 将数据字符串根据指定类型转换成相应对象** @param typeClass 对象的Class类型* @param param     数据字符串* @return 类型匹配失败时返回null*/public static Object toInstance(Class<?> typeClass, String param) {Object ans = null;if (int.class.equals(typeClass) || Integer.class.equals(typeClass)) {ans = toInteger(param);} else if (boolean.class.equals(typeClass) || Boolean.class.equals(typeClass)) {ans = toBoolean(param);} else if (String.class.equals(typeClass)) {ans = toString(param);} else if (typeClass.isArray()) {ans = toArray(typeClass.getComponentType(), param);} else if (List.class.isAssignableFrom(typeClass)) {Class<?> actualTypeArgument = (Class<?>) ((ParameterizedType) typeClass.getGenericSuperclass()).getActualTypeArguments()[0];ans = toList(actualTypeArgument, param);}return ans;}/*** 按不同数组类型,将入参对象转换为数组对象** @param elementType 数组元素类型* @param o           要转换为数组的对象* @return 数组类型未匹配成功时,返回 new Object[]{}*/public static Object toArray(Class<?> elementType, Object o) {return toArray(elementType, o, null);}/*** 按不同数组类型,将入参对象转换为数组对象** @param elementType 数组元素类型* @param o           要转换为数组的对象* @param surrounds   前后缀* @return 数组类型未匹配成功时,返回 new Object[]{}*/public static Object toArray(Class<?> elementType, Object o, String[] surrounds) {return toArray(elementType, o, surrounds, null);}/*** 按不同数组类型,将入参对象转换为数组对象** @param elementType 数组元素类型* @param o           要转换为数组的对象* @param surrounds   前后缀* @param delimiter   分隔符* @return 数组类型未匹配成功时,返回 new Object[]{}*/public static Object toArray(Class<?> elementType, Object o, String[] surrounds, String delimiter) {List<?> list = toList(elementType, o, surrounds, delimiter);// 如果直接将List转成数组,泛型信息会丢失,这里需要二次处理if (int.class.equals(elementType)) {return toIntArray(list);  // 基本数据类型数组需要单独处理} else if (Integer.class.equals(elementType)) {return list.toArray(new Integer[0]);} else if (String.class.equals(elementType)) {return list.toArray(new String[0]);}return new Object[]{};}/*** 将List列表转换为int数组** @param list* @return*/public static int[] toIntArray(List<?> list) {int[] ansArray = (int[]) Array.newInstance(int.class, list.size());for (int i = 0; i < list.size(); i++) {ansArray[i] = toInteger(list.get(i));}return ansArray;}/*** 将对象转换为List列表** @param elementType 指定元素类型* @param o           要转为列表的对象* @return List列表(ArrayList对象)*/public static List<?> toList(Class<?> elementType, Object o) {return toList(elementType, o, null, null);}/*** 将对象转换为List列表** @param elementType 指定元素类型* @param o           要转为列表的对象* @param surrounds   前后缀,默认使用 new String[]{"[", "]"}* @param delimiter   分隔符,默认使用 ","(无空格)* @return List列表(ArrayList对象)*/public static List<?> toList(Class<?> elementType, Object o, String[] surrounds, String delimiter) {List<Object> ansObjectList = new ArrayList<>();if (null == o) {return ansObjectList;}if (null == delimiter) {delimiter = ",";  // 分隔符默认不带空格}if (null == surrounds || surrounds.length < 2) {surrounds = new String[]{"[", "]"};}String dataString = toString(o);if (0 == dataString.indexOf(surrounds[0])) {  // 剔除前缀dataString = dataString.substring(surrounds[0].length());}if (dataString.length() - surrounds[1].length() == dataString.indexOf(surrounds[1])) {  // 剔除后缀(列表内元素及分隔符不包含后缀的情况下,否则有bug)dataString = dataString.substring(0, dataString.length() - surrounds[1].length());}String[] dataStrings = dataString.split(delimiter);for (String dataStr : dataStrings) {ansObjectList.add(toInstance(elementType, dataStr));}return ansObjectList;}/*** 检查对象类型,分门别类对对象作相应处理** @param o 要获取字符串的对象* @return 未能识别类型的对象,返回String.valueOf(o)值*/public static String toString(Object o) {return toString(o, null);}/*** 检查对象类型,分门别类对对象作相应处理** @param o         要获取字符串的对象* @param surrounds 列表、数组类型要加注的前后缀* @return 未能识别类型的对象,返回String.valueOf(o)值*/public static String toString(Object o, String[] surrounds) {return toString(o, surrounds, null);}/*** 检查对象类型,分门别类对对象作相应处理** @param o             要获取字符串的对象* @param surrounds     列表、数组类型要加注的前后缀* @param joinDelimiter 列表、数组类型元素间的分隔符* @return 未能识别类型的对象,返回String.valueOf(o)值*/public static String toString(Object o, String[] surrounds, String joinDelimiter) {if (null == o) {return "";}if (Class.class.equals(o.getClass())) {Class<?> oClass = (Class<?>) o;return oClass.isArray() ? oClass.getComponentType().getName() + "[]" : oClass.getName();  // 数组类型使用元素类型加方括号表示} else if (String.class.equals(o.getClass())) {return o.toString();} else if (o.getClass().isArray()) {return toArrayString(o, surrounds, joinDelimiter);} else if (o instanceof List) {return toString(((List<?>) o).toArray(), surrounds, joinDelimiter);  // List对象转为Object数组}return String.valueOf(o);}/*** 将数组转换为字符串* <p>* (由于数组类型不能直接转换,所以)根据元素类型,对不同数组作相应转换处理** @param o             数组对象* @param surrounds     前后缀,默认使用方括号 new String[]{"[", "]"}* @param joinDelimiter 分隔符,默认使用", "* @return 未能识别的元素类型返回其String.valueOf(o) + "-ArrStr"值*/public static String toArrayString(Object o, String[] surrounds, String joinDelimiter) {// 分隔符和前后缀字符统一处理,各类型子方法不再校验,故设为私有if (null == o) {return "";}if (null == joinDelimiter) {joinDelimiter = ", ";}if (null == surrounds || surrounds.length < 2) {surrounds = new String[]{"[", "]"};}// 各类型数组分别(数组类型不同无法直接向父类强转)强制类型转换,调用Stream方式处理if (Class.class.equals(o.getClass().getComponentType())) {return toObjectArrayString(Arrays.stream((Class[]) o), surrounds, joinDelimiter);} else if (Integer.class.equals(o.getClass().getComponentType())) {return toObjectArrayString(Arrays.stream((Integer[]) o), surrounds, joinDelimiter);} else if (String.class.equals(o.getClass().getComponentType())) {return toObjectArrayString(Arrays.stream((String[]) o), surrounds, joinDelimiter);} else if (Object.class.equals(o.getClass().getComponentType())) {return toObjectArrayString(Arrays.stream((Object[]) o), surrounds, joinDelimiter);} else if (int.class.equals(o.getClass().getComponentType())) {return toIntArrayString(((int[]) o), surrounds, joinDelimiter);}return String.valueOf(o) + "-ArrStr";}/*** 将int数组转换为字符串** @param array         int数组* @param surrounds     前后缀(括号)* @param joinDelimiter 分隔符(逗号)* @return*/private static String toIntArrayString(int[] array, String[] surrounds, String joinDelimiter) {return surrounds[0] + String.join(joinDelimiter, Arrays.stream(array).mapToObj(Convert::toString).toArray(String[]::new)) + surrounds[1];}/*** 将stream流中的元素组装为字符串** @param stream        包装类型数组的流序列* @param surrounds     前后缀(括号)* @param joinDelimiter 分隔符(逗号)* @return*/private static String toObjectArrayString(Stream<?> stream, String[] surrounds, String joinDelimiter) {return surrounds[0] + stream.map(Convert::toString).collect(Collectors.joining(joinDelimiter)) + surrounds[1];}/*** 转换为布尔值** @param o* @return null时返回false*/public static Boolean toBoolean(Object o) {if (null == o) {return false;}return Boolean.parseBoolean(toString(o));}/*** 转换为整数** @param o* @return o的整数值,null时返回0*/public static Integer toInteger(Object o) {if (null == o) {return 0;}return Integer.parseInt(toString(o));}
}

声明:本文使用八爪鱼rpa工具从gitee自动搬运本人原创(或摘录,会备注出处)博客,如版式错乱请评论私信,如情况紧急或久未回复请致邮 xkm.0jiejie0@qq.com 并备注原委;引用本人笔记的链接正常情况下均可访问,如打不开请查看该链接末尾的笔记标题(右击链接文本,点击 复制链接地址,在文本编辑工具粘贴查看,也可在搜索框粘贴后直接编辑然后搜索),在本人博客手动搜索该标题即可;如遇任何问题,或有更佳方案,欢迎与我沟通!

相关文章:

数据类型自动转换的解决方案

数据类型自动转换的解决方案 java8、jdk8背景 为方便测试框架数据处理以及方便查看一些数据&#xff0c;弄了一个工具类&#xff0c;部分要点简要说明。 主要涉及到字符串与其他类型的相互转换&#xff0c;无其他类型之间的相互转换。 轻量测试框架实现与使用的总篇可见此文…...

大厂校招:唯品会Java面试题及参考答案

SortedSet 的原理 SortedSet 是一个有序的集合接口,它继承自 Set 接口。在 Java 中,常见的实现类有 TreeSet。 TreeSet 实现了 SortedSet 接口,它使用红黑树来维护集合中元素的有序性。红黑树是一种自平衡的二叉搜索树,具有以下特点: 每个节点要么是红色,要么是黑色。根节…...

Qt常用控件——QLCDNumber

文章目录 QLCDNumber核心属性倒计时小程序倒计时小程序相关问题 QLCDNumber核心属性 QLCDNumber是专门用来显示数字的控件&#xff0c;类似于这样&#xff1a; 属性说明intValue获取的数字值(int).value获取的数字值(double)和intValue是联动的例如value设为1.5&#xff0c;in…...

专业学习|GERT网络概览(学习资源、原理介绍、变体介绍)

一、GERT 网络概览 GERT(Graphical Evaluation Review Technique&#xff0c;图示评审技术)是一种结合流线图理论(Flow Graphical Theory)、矩母函数(Moment Generating Function)、计划评审技术(Program Evaluation Review Technique)解决随机网络问题的方法&#xff0c;描述各…...

搭建一个基于角色的权限验证框架

说明&#xff1a;基于角色的权限验证&#xff08;Role-Based Access Control&#xff0c;RBAC&#xff09;框架&#xff0c;是目前大多数服务端的登录校验框架。本文介绍如何快速搭建一个这样的框架&#xff0c;不用Shiro、Spring Security、Sa-Token这样的“大框架”实现。 R…...

下载chromedriver驱动

首先进入关于ChromeDriver最新下载地址&#xff1a;Chrome for Testing availability 进入之后找到与自己所匹配的&#xff0c;在浏览器中查看版本号&#xff0c;下载版本号需要一致。 下载即可&#xff0c;解压&#xff0c;找到 直接放在pycharm下即可 因为在环境变量中早已配…...

在STM32工程中使用Mavlink与飞控通信

本文讲述如何在STM32工程中使用Mavlink协议与飞控通信&#xff0c;特别适合自制飞控外设模块的项目。 需求来源&#xff1a; 1、增稳云台里的STM32单片机需要通过串口接收飞控传来的云台俯仰、横滚控制指令和相机拍照控制指令&#xff1b; 2、自制的有害气体采集器需要接收飞…...

【Elasticsearch】-7.17.24版本接入

官网 https://www.elastic.co/cn/downloads/elasticsearch 本项目基于windows环境下&#xff0c;其他环境操作类似 1、初始化配置 打开config/elasticsearch.yaml 添加如下配置 cluster.name: dams_clusternetwork.host: 127.0.0.1 http.port: 9200# 不开启geo数据库 inge…...

ShouldSniffAttr在自动化测试中具体是如何应用?

在自动化测试中&#xff0c;ShouldSniffAttr 这样的函数名通常暗示它是一个用于断言&#xff08;assertions&#xff09;的工具&#xff0c;用于检查某个元素或属性是否符合预期的条件。 虽然这不是一个标准的函数名&#xff0c;但我们可以根据命名推测其用途。 例如&#xf…...

前端vue3打印,多页打印,不使用插件(工作中让我写一个打印功能)

说下总体思路&#xff0c;创建一个组件&#xff0c;里面放多个span字段&#xff0c;然后根据父组件传入的参数&#xff0c;生成子组件&#xff0c;最好我们打印子组件的信息即可。通过我多次ai&#xff0c;探索最后成功了。 子组件代码 media print 这个我要讲一下&#xff…...

传感技术是如何实现实时监测和控制的呢

传感技术在力士乐拧紧系统中实现实时监测和控制的方式主要通过以下几个步骤进行&#xff1a; 一、传感器数据采集 1. 传感器种类&#xff1a; 力士乐拧紧系统中可能包含多种传感器&#xff0c;如力矩传感器、角度传感器和转速传感器等。这些传感器各自负责检测拧紧过程中的不…...

为什么mac打不开rar文件 苹果电脑打不开rar压缩文件怎么办

你是否遇到过这样的情况&#xff0c;下载了一个rar文件&#xff0c;想要查看里面的内容&#xff0c;却发现Mac电脑无法打开。rar文件是一种常见的压缩文件格式&#xff0c;它可以将多个文件或文件夹压缩成一个文件&#xff0c;节省空间和传输时间。如此高效实用的压缩文档&…...

linux下日志系统setvbuf接口及结构体 handle_file_t成员介绍

typedef struct handle_file_t {uint8_t *wkey;//用于存储写入文件时可能需要的加密密钥int cflag;//用于表示日志文件的某些配置标志&#xff0c;例如是否启用压缩、是否启用加密等char *file_path;//用于存储日志文件的路径FILE *…...

ESP8266+httpServer+GET+POST实现网页验证密码

1. 代码 #include "esp_http_server.h" #include "esp_log.h" #include "web_server.h"// 辅助宏&#xff0c;用于计算两个数中的较小值 #define MIN(a, b) ((a) < (b) ? (a) : (b))static const char *TAG "wifi web_server";c…...

git仓库修改ip,本地代码修改

只需求修改本地项目下面的.git文件夹下的config 替换ip即可...

轻便灵活,声学卓越,流动会场创新应用—轻空间

随着现代社会对高效、灵活场地需求的日益增加&#xff0c;传统建筑场馆的局限性逐渐显现。无论是大型会议、临时展览&#xff0c;还是文化活动&#xff0c;企业与组织往往需要一个既能快速搭建&#xff0c;又具备顶级声学效果的多功能场所。由轻空间打造的流动会场应运而生&…...

13 Midjourney从零到商用·进阶篇:灯光、角度与风格等精细控制方法

在前面我们了解了提示词的书写&#xff0c;那么如何利用提示词来精确控制生成画面的灯光、角度与风格 呢&#xff1f;在本篇文章中我么一起来探讨一下。 一、灯光 在摄影中&#xff0c;对灯光的要求都是非常高的。灯光能对人物、动物、物体、场景等进行修饰。每一种微小的的灯光…...

为什么要把raw转成yuv

将RAW图像数据转换为YUV格式在图像处理和视频编解码领域有多个重要的原因。以下是一些主要原因&#xff1a; 1. 标准化和兼容性 视频编解码标准&#xff1a;YUV格式是许多视频编解码标准&#xff08;如H.264、H.265等&#xff09;所使用的颜色空间。将RAW数据转换为YUV可以使…...

基于双向RRT算法的三维空间最优路线规划matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 单向RRT算法 4.2 双向RRT算法 5.完整程序 1.程序功能描述 基于双向RRT&#xff08;Randomly Exploring Random Trees, 随机探索随机树&#xff09;算法的三维空间最优路径规划是一种解…...

若依-原理

1.代码生成器 1.1源码分析 代码生成器分为两个部分&#xff1a; 第一部分涉及将业务表结构导入到系统中 第二部分是点击生成按钮&#xff0c;系统将根据表结构生成相应的前后端代码&#xff0c;并提供下载。 1.表结构说明 gen_table&#xff1a;存储业务表的基本信息 &am…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...