如何解决通用数据类型转换方法
在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的,一些默认的映射器已被定义(即LongMapper
,IntMapper
,DoubleMapper
),有一个叫实用工具类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
。当我说“数据类型”在这里,我的意思是类型仅限于那些常用来代表原始数据:Integer
,String
,Date
等。对于这个问题,我们可以考虑原语装箱的目的。
我想知道是否有任何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 举报,一经查实,本站将立刻删除。