代码之家  ›  专栏  ›  技术社区  ›  Roman

将集合转换为数组的最简单方法是什么?

  •  106
  • Roman  · 技术社区  · 14 年前

    假设我们有一个 Collection<Foo> . 最好的(在当前上下文中最短的LoC)转换方法是什么 Foo[] 众所周知的

    UPD:(本节还有一个案例;如果您认为值得为它创建另一个线程,请留下评论):转换呢 Bar[] 哪里 Bar Foo public Bar(Foo foo){ ... }

    7 回复  |  直到 14 年前
        1
  •  266
  •   Auroratic    9 年前

    在哪里? x 是集合:

    Foo[] foos = x.toArray(new Foo[x.size()]);
    
        2
  •  37
  •   Jules    11 年前

    使用Java 8更新问题的替代解决方案:

    Bar[] result = foos.stream()
        .map(x -> new Bar(x))
        .toArray(size -> new Bar[size]);
    
        3
  •  11
  •   Andreas Dolk    14 年前

    如果您多次使用它或在循环中使用它,您可以定义一个常量

    public static final Foo[] FOO = new Foo[]{};
    

    像这样做转换

    Foo[] foos = fooCollection.toArray(FOO);
    

    toArray 方法将获取空数组以确定目标数组的正确类型,并为您创建一个新数组。


    以下是我的更新建议:

    Collection<Foo> foos = new ArrayList<Foo>();
    Collection<Bar> temp = new ArrayList<Bar>();
    for (Foo foo:foos) 
        temp.add(new Bar(foo));
    Bar[] bars = temp.toArray(new Bar[]{});
    
        4
  •  6
  •   Naman    6 年前

    在JDK/11中,转换 Collection<Foo> Foo[] 可能是利用 Collection.toArray(IntFunction<T[]> generator) 作为:

    Foo[] foos = fooCollection.toArray(new Foo[0]); // before JDK 11
    Foo[] updatedFoos = fooCollection.toArray(Foo[]::new); // after JDK 11
    

    @Stuart on the mailing list Collection.toArray(new T[0]) --

    结果是使用 Arrays.copyOf( 最快,可能是因为

    它可以避免零填充新分配的数组,因为它知道 公共API看起来像。

    JDK中API的实现如下:

    default <T> T[] toArray(IntFunction<T[]> generator) {
        return toArray(generator.apply(0));
    }
    

    默认实现调用 generator.apply(0) 获取零长度数组 然后直接打电话 toArray(T[]) Arrays.copyOf() 速度很快,所以基本上和 toArray(new T[0]) .


    注意 :-API的使用应遵循 向后不相容 null toArray(null) toArray(T[] a) 无法编译。

        5
  •  5
  •   Andrea Bergonzo l'L'l    5 年前

    如果你在项目中使用番石榴,你可以使用 Iterables::toArray

    Foo[] foos = Iterables.toArray(x, Foo.class);
    
        6
  •  3
  •   Community Nick Bolton    7 年前

    原版见 doublep

    Foo[] a = x.toArray(new Foo[x.size()]);
    

    至于更新:

    int i = 0;
    Bar[] bars = new Bar[fooCollection.size()];
    for( Foo foo : fooCollection ) { // where fooCollection is Collection<Foo>
        bars[i++] = new Bar(foo);
    }    
    
        7
  •  3
  •   Community Nick Bolton    7 年前

    Collections2.transform (fooCollection, new Function<Foo, Bar>() {
        public Bar apply (Foo foo) {
            return new Bar (foo);
        }
    }).toArray (new Bar[fooCollection.size()]);
    

    但是,这里的关键方法在 the doublep's answer toArray 方法)。

        8
  •  -1
  •   Eric Aya    5 年前

    例如,您有一个集合ArrayList,其中包含学生类的元素:

    List stuList = new ArrayList();
    Student s1 = new Student("Raju");
    Student s2 = new Student("Harish");
    stuList.add(s1);
    stuList.add(s2);
    //now you can convert this collection stuList to Array like this
    Object[] stuArr = stuList.toArray();           // <----- toArray() function will convert collection to array