【问题标题】:Converting an array of long to ArrayList<Long>将 long 数组转换为 ArrayList<Long>
【发布时间】:2010-12-31 02:07:00
【问题描述】:

遗憾的是,这不起作用:

long[] longs = new long[]{1L};
ArrayList<Long> longArray = new ArrayList<Long>(longs);

除了手动添加之外,还有更好的方法吗?

【问题讨论】:

标签: java list collections


【解决方案1】:

在 JDK 1.8 中,使用 Lambda 和 Stream API,我们可以这样做:

long[] longArr = {3L, 4L, 5L, 6L, 7L};
List<Long> longBoxArr = Arrays.stream(longArr).boxed().collect(Collectors.toList());

【讨论】:

  • 我们需要这个答案。
【解决方案2】:

使用来自 apache commons-lang 的 ArrayUtils

long[] longs = new long[]{1L};
Long[] longObjects = ArrayUtils.toObject(longs);
List<Long> longList = java.util.Arrays.asList(longObjects);

【讨论】:

  • +1 打败我,该死,我花了太长时间滚动浏览 ArrayUtils javadoc :)
  • :) 我在 Eclipse 中打开它(使用反编译器)
  • 这不是很重要,但我不喜欢复制数组两次。我最终滚动了一个实用程序函数来直接执行此操作。
【解决方案3】:

使用Dollar,您只需一行代码即可完成此转换:

long[] longs = new long[]{1L};
List<Long> longList = $(longs).toList();

您也可以轻松地将它们装箱:

Long[] arrayOfLongs = $(longs).toArray();

【讨论】:

    【解决方案4】:

    注意使用java.lang.Long,而不是long

    final Long[] longs = new Long[]{1L};
    final List<Long> longArray = Arrays.asList(longs);
    

    不添加任何第三方依赖项。

    【讨论】:

    • 如果你能改变问题,你可以直接使用Arrays.asList(),不需要额外的ArrayList构造。
    • 我们都想把问题改成更容易解决的问题吗?所以我编辑了我的帖子以反映韦恩的更清洁的解决方案。一定要记得先阅读自己的帖子。
    【解决方案5】:

    由于其他人建议使用外部库,这里是 Google Guava libraries 方式:

    long[] longs = {1L, 2L, 3L};
    List<Long> longList = com.google.common.primitives.Longs.asList(longs);
    

    Relevant javadoc for Longs.

    【讨论】:

      【解决方案6】:

      Bozho 的回答很好,但我不喜欢复制数组两次。我最终为此推出了自己的实用方法:

      public static ArrayList<Long> convertArray(long[] array) {
        ArrayList<Long> result = new ArrayList<Long>(array.length);
        for (long item : array)
          result.add(item);
        return result;
      }
      

      【讨论】:

      • 请注意,在 bozho 的回答中,数组不会被复制两次,而只会复制一次:Arrays.asList 不会返回副本,而是返回数组周围的包装器(包装器实现 List 接口) .需要第一个副本,因为 Arrays.asList 不适用于原始类型,因此第一次从原始(长)转换为对象类型(长)。请参阅 Wayne Young 对直接包装解决方案的回答(根本没有副本)。
      • 好吧,但至少这是给出的唯一答案,它实际上返回的是 ArrayList 而不是 List...
      【解决方案7】:

      您可以通过静态工厂实现AbstractList 来避免复制。对列表的所有更改都会写入数组,反之亦然。

      在某处创建此方法。

      public static List<Long> asList(final long[] l) {
          return new AbstractList<Long>() {
              public Long get(int i) {return l[i];}
              // throws NPE if val == null
              public Long set(int i, Long val) {
                  Long oldVal = l[i];
                  l[i] = val;
                  return oldVal;
              }
              public int size() { return l.length;}
          };
      }
      

      然后调用这个方法来创建数组。您需要在声明中使用接口 List 而不是实现 ArrayList

      long[] longs = new long[]{1L, 2L, 3L};
      List<Long> longArray = asList(longs);
      

      我从language guide 学到了这项技术。

      【讨论】:

        猜你喜欢
        • 2019-06-21
        • 1970-01-01
        • 1970-01-01
        • 2016-04-19
        • 1970-01-01
        • 1970-01-01
        • 2017-10-03
        • 2021-02-01
        • 2013-07-26
        相关资源
        最近更新 更多