The easiest way to transform collection to array?

后端 未结 8 1794
故里飘歌
故里飘歌 2020-11-27 12:37

Suppose we have a Collection. What is the best (shortest in LoC in current context) way to transform it to Foo[]? Any well-known

8条回答
  •  温柔的废话
    2020-11-27 12:50

    With JDK/11, an alternate way of converting a Collection to an Foo[] could be to make use of Collection.toArray(IntFunction generator) as:

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

    As explained by @Stuart on the mailing list(emphasis mine), the performance of this should essentially be the same as that of the existing Collection.toArray(new T[0]) --

    The upshot is that implementations that use Arrays.copyOf() are the fastest, probably because it's an intrinsic.

    It can avoid zero-filling the freshly allocated array because it knows the entire array contents will be overwritten. This is true regardless of what the public API looks like.

    The implementation of the API within the JDK reads:

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

    The default implementation calls generator.apply(0) to get a zero-length array and then simply calls toArray(T[]). This goes through the Arrays.copyOf() fast path, so it's essentially the same speed as toArray(new T[0]).


    Note:- Just that the API use shall be guided along with a backward incompatibility when used for code with null values e.g. toArray(null) since these calls would now be ambiguous because of existing toArray(T[] a) and would fail to compile.

提交回复
热议问题