3

我正在尝试简化我的代码,但我有一个问题:是否可以将由逗号分隔的 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));
    }

我可以通过使用例如Type collectionType = new TypeToken<List<Long>>() {}.getType();gson 来简化此代码吗?

4

6 回答 6

2

你考虑过 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());
于 2012-07-18T14:49:51.080 回答
1

或使用一些库,如番石榴?这样您的代码中就没有循环(但在他们的代码中)?我看到您提到您的目标是“简化我的代码”

例如

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);
    }
});
于 2012-07-18T14:40:47.377 回答
0

没有循环就没有可用的方法。即使有一种方法可用,它在您看来也是一个单一的操作,但显然它必须

内部循环。

例如:Arrays.fill(arrayname, intval);

这是用任何整数值填充数组的单一方法。但在内部,它也会在数组上运行一个循环。

于 2012-07-18T14:31:15.990 回答
0

认为没有looping你可以做到这一点。如何在collection's 没有明确转换的情况下更改您的内容类型。

于 2012-07-18T14:20:51.440 回答
0

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)) 
于 2012-07-18T14:32:38.670 回答
0

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

 //....
于 2012-07-18T14:47:25.500 回答