当前位置: 首页 > 面试题库 >

通用数据类型转换方法

阎啸
2023-03-14
问题内容

从他的问题中很明显,他需要从任何数据类型转换T1为另一种类型T2。当我说“数据类型”在这里,我的意思是类型仅限于那些常用来代表原始数据:IntegerStringDate等。对于这个问题,我们可以考虑原语装箱的目的。

我想知道是否有任何API支持类型之间的转换,其中输入和输出都被概括为一组受支持的数据类型。我看了Apache
Commons的beanutils.converters包
,但是每个已知输入都有一个单独的转换器类。我正在寻找实现类似于以下签名的功能:

static <IN, OUT> OUT convert(IN value, Class<OUT> targetType);

要不然

static <IN, OUT> OUT convert(IN value, OUT defaultValue);

使用一堆else if指向各种Commons Converter 的块,或者Map<Class<?>, Converter>出于相同目的使用a来实现这种映射,实际上并不太难。但是我想知道某处是否支持这种功能。

另外,如果最后要重复,我深表歉意。我试图找到类似的问题,但发现没有一个适合这种情况时,我感到很惊讶。

编辑: 因此,此代码的示例在操作中将是:

Integer i = GenericConverter.convert("123", Integer.class);    //returns 123
Date d = GenericConverter.convert(1313381772316L, Date.class); //returns today's date
Boolean b = GenericConverter.convert(0, Boolean.class);        //returns false
Long l = GenericConverter.convert("asdf", Long.class);         //RuntimeException

更新:
我链接的BalusC代码接近目标,而Bohemian的答案是一个很好的轻量级解决方案(尽管它不适用于布尔转换)。他也说对了,如果我们要归纳这些其他数据类型的转换,可能应该单独处理日期。我仍然希望获得其他答案-
特别是如果某个地方有更多的免提API。


问题答案:

在JDK
8中,
可以使用新java.util.functions.Mapper接口和lambda表达式轻松实现这一点。

Mapper<String,Integer> atoi = s -> Integer.valueOf(s);
Integer r = atoi.map("10");

使用方法引用可以更加简单:

Mapper<String, Integer> atoi = Integer::new;
Integer r = atoi.map("10");

或类似的东西:

List<Long> dates = asList(1344754620310L,1344754854877L);
List<Date> asDates = dates.map(Date::new).into(new ArrayList<Date>());

或很酷的转换,例如:

List<Integer> myInts = "5,4,3,2,1,0,6,7,8,9"
  .splitAsStream(",")
  .map(Integer::new)
  .into(new ArrayList<Integer>());

在目前实施的JDK8
API的,一些默认的映射器已被定义(即LongMapperIntMapperDoubleMapper),有一个叫实用工具类Mappers,它定义了一些其他类似的字符串映射器和身份映射,恒定映射器等。

我不确定这是否是您要追求的目标,但是肯定它是实现它的好方法。

您建议的情况如下:

static <IN, OUT> OUT convert(IN value, Class<OUT> targetType);

可以使用Mappers实用程序类实现:

Mapper<String, Integer> atoi = Mappers.instantiate(String.class, Integer.class);
Integer r = atoi.map("10");

和您的签名:

static <IN, OUT> OUT convert(IN value, OUT default);

可以通过以下方式实现:

Mapper<String, Integer> atoi = chain(substitute(null, "0"), Integer::new);
Integer r = atoi.map(null); //produces 0

因此,像这样的代码…

List<String> data = asList("0", null, "2", null, "4", null, "6");
List<Integer> myInts = data.map(chain(substitute(null, "0"), Integer::new)).into(new ArrayList<Integer>());
System.out.println(myInts);

将产生: [0, 0, 2, 0, 4, 0, 6]



 类似资料:
  • 本文向大家介绍SQL Server数据类型转换方法,包括了SQL Server数据类型转换方法的使用技巧和注意事项,需要的朋友参考一下 在SQL Server日常的函数、存储过程和SQL语句中,经常会用到不同数据类型的转换。在SQL Server有两种数据转换类型:一种是显性数据转换;另一种是隐性数据转换。下面分别对这两种数据类型转换进行简要的说明: 1 显式转换 显示转换是将某种数据类型的表达式

  • 本文向大家介绍winform dateTime数据类型转换方法,包括了winform dateTime数据类型转换方法的使用技巧和注意事项,需要的朋友参考一下 数据库中保存日期为NULL 程序中查出来判断的时候提示如下: 解决方案: 下面是其它网友的补充: C# winfrom中关於datetime数据类型转换问题,提示无法将字符型转换成datetime 数据库中有个字段date,数据类型是dat

  • JavaScript是一种动态类型语言,变量是没有类型的,可以随时赋予任意值。但是,数据本身和各种运算是有类型的,因此运算时变量需要转换类型。大多数情况下,这种数据类型转换是自动的,但是有时也需要手动强制转换。 强制转换 Number函数:强制转换成数值 String函数:强制转换成字符串 Boolean函数:强制转换成布尔值 自动转换 自动转换为布尔值 自动转换为字符串 自动转换为数值 小结 加

  • 本文向大家介绍通过实例解析PHP数据类型转换方法,包括了通过实例解析PHP数据类型转换方法的使用技巧和注意事项,需要的朋友参考一下 PHP的数据类型转换属于强制转换,允许转换的PHP数据类型有: (int)、(integer):转换成整形 (float)、(double)、(real):转换成浮点型 (string):转换成字符串 (bool)、(boolean):转换成布尔类型 (array):

  • 问题内容: 我的数据库是Postgres8。我需要将数据类型转换为另一个。这意味着column数据类型之一是并且需要在语句中将其与Postgres一起转换。 当前,我获取字符串值并将其转换为Java语言。 有什么办法吗?示例代码将不胜感激。 问题答案: cast(varchar_col AS int) – SQL standard 要么 这些语法变体在 任何地方 (几乎)都有效。第二种在特殊情况下

  • 主要内容:1、隐式类型转换,2、显式类型转换数据类型转换就是将一种类型的数据转换为另一种类型,在 C# 中有两种形式的类型转换方式,分别是隐式类型转换和显示类型转换,下面就来详细介绍一下。 1、隐式类型转换 隐式类型转换是由 C# 以类型安全的方式执行的,转换的过程中不会导致数据丢失,例如从较小的整数类型(例如 int)转换到较大的整数类型(例如 long),从派生类转换为基类。 隐式转换不需要我们编写额外的代码,下例中演示了如何使用隐式类