【问题标题】:Is it possible to avoid loop which will cast one object type to another in split() or Arrays.asList()?是否可以避免在 split() 或 Arrays.asList() 中将一种对象类型转换为另一种对象类型的循环?
【发布时间】:2012-07-18 14:14:24
【问题描述】:

我正在尝试简化我的代码,但我有一个问题:是否可以将由逗号分隔的 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&lt;List&lt;Long&gt;&gt;() {}.getType(); 来简化此代码吗?

【问题讨论】:

  • 标准库中没有循环的替代方案。如果您等待 Java 8,可能会有 有替代方案!
  • 旁注:你可以去掉condition_list_id,直接遍历数组:for(String str_id : condition_list_id_tmp) {
  • 谢谢@assylias 你是对的
  • @MarkoTopolnik,替代方案可能只是一个语法糖,但最后你需要阅读 -> 更改 -> 在这样的情况下写或者你期待其他的东西?
  • @Vash 是的,总会有一个循环。但是我想到的完全闭包超越了单纯的语法糖的水平:)

标签: java arrays type-conversion


【解决方案1】:

你考虑过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());

【讨论】:

  • 我使用 LambdaJ 有一段时间了,虽然这项技术本身很吸引人,但我最终还是放弃了它。它仅涵盖特殊情况的联合,因此每次您都想知道它是否涵盖了您的新需求以及如何涵盖。拜托,你看到马里奥 F. 所说的“关闭”了吗?这太荒谬了。这家伙根本不明白“在本地范围内关闭”的概念。
【解决方案2】:

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

例如

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);
    }
});

【讨论】:

  • 这里的代码如果只使用一次可能不会简单,但如果将Function提取出来多次使用,通过重用就可以节省和简单。
  • 是的,喜欢分两行 :)
  • Andriy,Java 8 的闭包把它变成一个单行。类似(请原谅我的不准确)transform(strList, (String input) =&gt; parseLong(input));.
【解决方案3】:

认为没有looping 你可以这样做。你的 collection's 内容类型怎么会在没有显式转换的情况下被更改。

【讨论】:

    【解决方案4】:

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

    内部循环。

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

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

    【讨论】:

    • 据我了解,它只会用相同的 Long 类型值填充 Long Array ?
    • 不不!它可以用该类型的相同值填充任何类型的数组。例如;它可以用 true 或 false 填充布尔数组,用一些 long 值填充长数组等。docs.oracle.com/javase/1.5.0/docs/api/java/util/Arrays.html 请参阅此处的文档
    【解决方案5】:

    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)) 
    

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-09-03
        • 1970-01-01
        • 2010-09-23
        • 2011-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多