Guava或Apache Commons Collections中是否有toArray()的通用版本?

33
我需要的是一个通用版本的Object[] java.util.Collection.toArray() 或使用T[] java.util.Collection.toArray(T[] array) 的简化版本。目前,我可以这样写:
Collection<String> strings;
String[] array = strings.toArray(new String[strings.size()]);

我需要的是类似以下内容的东西:

在IT技术方面,我正在寻找的是:

@SuppressWarnings("unchecked")
public static <T> T[] toArray(Collection<T> collection, Class<T> clazz) {
    return collection.toArray((T[]) Array.newInstance(clazz, collection.size()));
}

我可以将其用作:

String[] array = Util.toArray(strings, String.class);

Guava或Commons Collections中是否有类似实现的功能?

当然,我可以编写自己的代码(如上所示),这似乎和toArray(T[] array)一样快。


所以基本上,你只是不想输入array参数,但你愿意为静态方法和类字面值输入类名吗? - chrylis -cautiouslyoptimistic-
你想要削减与 strings.size() 相等长度的字符数量,这意味着你正在频繁进行此转换。因此答案是:减少转换次数。 - Boris the Spider
你因为还需要8个字符而感到担忧吗? - Olivier Grégoire
我也希望能少用它。 更重要的是,strings.size() 版本比 Iterables.toArray() 更难读,并且容易出错(在修改时必须保持两个 strings 引用同步)。更进一步地,现在我可以编写 Iterables.toArray(fooReturningArray(), String.class) - Mihai
2个回答

47
来自Guava的Iterables.toArray()方法。详情请参见此处

Iterables.toArray(strings, String.class); 是因为只有一个参数的 toArray 方法是包私有的。 - mkczyk

12

你可以使用缩短方式

String[] array = strings.toArray(new String[0]);

同时也更高效。

使用Java 8也可以这样做,但似乎过于复杂,可能更慢:

String[] array = strings.stream().toArray(String[]::new);     // Java 8

谢谢。然而,我不能使用Java 8,也不想在内存受限的设备(Android)上不必要地创建对象,如strings.toArray(new String[0])。此外,这些解决方案并没有比strings.toArray(new String[strings.size()])更易读。 - Mihai
4
如果那些“new String[0]”对你的性能产生了任何影响,那么恭喜你,你一定有一个运行极快的应用程序。 - Kevin Bourrillion
2
new String[0] 实际上会更快:https://shipilev.net/blog/2016/arrays-wisdom-ancients/ - Karol S
@KarolS 当然,已经更正了。我后来发现这个:https://dev59.com/j3VC5IYBdhLWcg3w0EsD#29444594 - assylias

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接