我试图简化我的代码,但我有一个问题:是否可以将由昏迷分隔的ID字符串转换为特定的集合类型?
所以,我现在的代码是:
String [] condition_list_id_tmp = rule.getContractRuleConditions().split(",");
List<String> condition_list_id = Arrays.asList(condition_list_id_tmp);
List<Long> condition_ids = new ArrayList<Long>();
for (String str_id : condition_list_id){
condition_ids.add(Long.parseLong(str_id));
}
我可以像gson中那样使用Type collectionType = new TypeToken<List<Long>>() {}.getType();
来简化这个代码吗?
您考虑过LambdaJ吗?
class StringToLong implements Converter<String, Long> {
public Long convert(String str) {
return Long.parseLong(str);
}
}
String [] condition_list_id_tmp = rule.getContractRuleConditions().split(",");
List<String> condition_list_id = Arrays.asList(condition_list_id_tmp);
List<Long> condition_ids = convert(condition_list_id, new StringToLong());
或者使用一些库,比如guava?这样在你的代码中就没有循环了(但在他们的代码中)?我看到你提到你的目标是"简化我的代码"
例如
final List<String> strList = Arrays.asList("1,2,3,4,5".split(","));
final List<Long> l = Lists.transform(strList, new Function<String, Long>() {
@Override
public Long apply(final String input) {
return Long.parseLong(input);
}
});
I不认为有了looping
就可以做到这一点。为什么您的collection's
内容类型会显式地用out-casting进行更改。
如果没有循环,就没有可用的方法。即使有一种方法可用,它在你看来也像是一个单一的操作,但显然它必须
内部循环。
例如:Arrays.fill(arrayname, intval);
这是用任意整数值填充数组的单一方法。但在内部,它也会在数组上运行一个循环。
java 8可以做到这一点:
String [] condition_list_id_tmp = rule.getContractRuleConditions().split(",");
List<String> condition_list_id = Arrays.asList(condition_list_id_tmp);
List<Long> condition_ids = condition_list_id.map(c -> Long.parseLong(c))
在Java 8上市之前,您的问题的解决方案可以是Guava项目,它支持Functional Idioms。
然后你可以用不同的方式执行该操作,但正如我在评论中所写的那样。最后你会有同样的操作。
public static List<Long> splitToLong(String list, String token) {
StringTokenizer tokenizer= new StringTokenizer(list, token);
List<Long> result = new ArrayList<Long>();
while(tokenizer.hasMoreTokens() {
result.add(Long.parseLong(tokenizer.nextToken()));
}
}
如果你把这个方法放在一些Util类中,那么你就可以享受干净的代码
//....
for(Long mLong : StringHelper.splitToLong(message,",")) {
//Do something with mLong
}
//....