是否可以避免在split()或Arrays.asList()中将一种对象类型强制转换为另一种对象的循环



我试图简化我的代码,但我有一个问题:是否可以将由昏迷分隔的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
 }
 //....

最新更新