【问题标题】:What is the best way of converting List<Long> object to long[] array in java?在 java 中将 List<Long> 对象转换为 long[] 数组的最佳方法是什么?
【发布时间】:2011-09-04 17:22:08
【问题描述】:

是否有任何实用方法可以将数值类型列表转换为原始类型数组? 换句话说,我正在寻找比这更好的解决方案。

private long[] toArray(List<Long> values) {
    long[] result = new long[values.size()];
    int i = 0;
    for (Long l : values)
        result[i++] = l;
    return result;
}

【问题讨论】:

标签: java collections


【解决方案1】:

Google Guava : Longs.toArray(Collection)

long[] result = Longs.toArray(values);

【讨论】:

    【解决方案2】:

    使用Apache Commons 中的ArrayUtils.toPrimitive(Long[] array)

    Long[] l = values.toArray(new Long[values.size()]);
    long[] l = ArrayUtils.toPrimitive(l);
    

    【讨论】:

    • 您可能需要指定您希望返回一个long 数组:values.toArray(new long[0]);
    • @Gary Buyn:您不能将原始类型用作泛型参数。
    • 我不知道为什么你得到了 4 票,但是这段代码甚至不能编译你不能从 Object[] 转换为 long[]。
    • @Vash 是的,我一发布就意识到了。
    • 如果使用 gradle(如在 android 中),请使用依赖项 compile 'org.apache.commons:commons-lang3:3.4'(更改为最新版本)添加 Apache Commons 库(及其类 ArrayUtils)。
    【解决方案3】:

    我不记得有什么本机方法可以做到这一点,但是创建一个自我有什么问题;-)。

    public class YasinUtilities {
    
        public static long[] toArray(Iterator<Long) values) { //Better choice would be Enumerator but easier is this way. 
    
          if(value == null) {
            //return null or throw exception 
          }
    
          long[] result = new long[values.size()];
    
          Long current = null;
          int i = 0;
          while(values.hasNext()) {
    
           current = values.next();
    
           if(current == null) {
             result[i++] = 0L; //or -1;
           } else {
             result[i++] = current.longValue();
           }
          }
       } 
    }
    

    【讨论】:

      【解决方案4】:

      从 Java 8 开始,您可以执行以下操作:

      long[] result = values.stream().mapToLong(l -> l).toArray();
      

      这里发生了什么?

      1. 我们将List&lt;Long&gt; 转换为Stream&lt;Long&gt;
      2. 我们致电mapToLong 以获取LongStream
        • mapToLong 的参数是 ToLongFunction,其结果类型为 long
        • 因为 Java 自动将 Long 拆箱为 long,所以在 lambda 表达式工作时写入 l -&gt; lLong 在此处转换为 long。我们也可以更明确地使用Long::longValue
      3. 我们调用toArray,它返回一个long[]

      【讨论】:

      • 你能解释一下这里发生了什么吗?
      • @VaidAbhishek 完成 :)。
      • 我试图用你的例子返回 Long[],但是当我调用 toArray 时它仍然返回 long[]。你能给出一个完整的方法调用来返回 Long[]
      • @MoayadAbuJaber 你想要Long[] 代替吗?那只是values.toArray(new Long[0])
      • 在 Android 中,此调用需要最低 API 级别 24,因此如果您的目标是较低级别,则不能使用它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-31
      • 2020-09-05
      • 1970-01-01
      • 2014-08-10
      • 1970-01-01
      • 1970-01-01
      • 2014-03-25
      相关资源
      最近更新 更多