【问题标题】:Is there a built-in Java method to box an array?是否有内置的 Java 方法来装箱数组?
【发布时间】:2010-04-06 15:03:07
【问题描述】:

有没有我可以使用的标准方法来代替这个自定义方法?

public static Byte[] box(byte[] byteArray) {
    Byte[] box = new Byte[byteArray.length];
    for (int i = 0; i < box.length; i++) {
        box[i] = byteArray[i];
    }
    return box;
}

【问题讨论】:

  • 出于好奇,为什么要创建一个装箱值数组?
  • 可能在列表或其他数据结构中使用它们,因为 java 不允许原始泛型。

标签: java boxing


【解决方案1】:

不,JDK中没有这种方法。

不过,通常情况下,Apache Commons Lang 提供 such a method

【讨论】:

    【解决方案2】:

    进入Java 8,你可以做以下(装箱):

    int [] ints = ...
    Integer[] boxedInts = IntStream.of(ints).boxed().toArray(Integer[]::new);
    

    但是,这仅适用于 int[]long[]double[]。这不适用于byte[]

    您也可以轻松完成反向操作(拆箱)

    Integer [] boxedInts = ...
    int [] ints = Stream.of(boxedInts).mapToInt(Integer::intValue).toArray();
    

    【讨论】:

    • 您也可以:List&lt;Integer&gt; boxedList = IntStream.of(ints).boxed().collect(Collectors.toList())
    • @juanmf 正确,但这并不能直接回答帖子:List&lt;Integer&gt; 不是 Integer [] 所要求的盒装 array
    【解决方案3】:

    除了 YoYo 的回答,你可以对 any 原始类型执行此操作;让primArray 成为PrimType[] 类型的标识符,那么您可以执行以下操作:

    BoxedType[] boxedArray = IntStream.range(0, primArray.length).mapToObj(i -> primArray[i]).toArray(BoxedType[] :: new);
    

    【讨论】:

    • 我已经多次看到这个解决方案 - 在我看来,它似乎不是一个干净的解决方案(你引入非封闭变量的方式)。但是我似乎没有找到一个真正好的反对它的论据。
    【解决方案4】:

    查看 Apache Commons Lang 源代码时,我们可以看到它只是在每个数组元素上调用 Byte#valueOf(byte)

        final Byte[] result = new Byte[array.length];
        for (int i = 0; i < array.length; i++) {
            result[i] = Byte.valueOf(array[i]);
        }
        return result;
    

    同时,常规的 java lint 工具表明不需要装箱,您可以按原样分配元素。

    所以基本上你在做同样的事情 apache commons 做的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 2015-10-24
      • 1970-01-01
      • 2012-12-30
      • 2011-04-03
      • 2015-12-08
      • 2020-01-26
      相关资源
      最近更新 更多