微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通用数据类型转换方法

如何解决通用数据类型转换方法

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]

解决方法

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

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

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

要不然

static <IN,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。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。