在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]



