使用 Guava 将 Iterable 转换为数组

Posted

技术标签:

【中文标题】使用 Guava 将 Iterable 转换为数组【英文标题】:Convert Iterable to Array using Guava 【发布时间】:2013-07-31 19:10:42 【问题描述】:

我需要返回一个String 数组。我使用番石榴来拆分String。请看下面的代码

Iterable<String> arrayOfValues =  Splitter.on(";").split(myString);

它返回一个Iterable。但我需要一个String[]。有什么方法可以提供Iterator&lt; Element &gt; 并将其转换为Array[]。非常感谢

【问题讨论】:

【参考方案1】:

我真的同意@rec 的回答:如果不需要,不要使用花哨的库

但是,我强烈推荐阅读 Guava 的分离器documentation:

因为 java 内置拆分器可能有一些棘手的行为..

例如,假设您的输入中有尾随逗号或连续逗号。 拆分后会返回什么?

null "" (废弃)

;)

【讨论】:

容易出错的建议使用Splitter而不是String.split,见errorprone.info/bugpattern/StringSplitter【参考方案2】:

在 java 8 中,我更喜欢使用流将可迭代对象转换为数组:

StreamSupport.stream(yourIterable.spliterator(), false).toArray(String[]::new)

【讨论】:

【参考方案3】:

没有 Guava,您可以将 Iterable&lt;String&gt; 转换为类似这样的数组

public static <String> String[] toArray(Iterable<String> itr) 
    ArrayList<String> ret = new ArrayList<>();
    for(String t : itr) 
        ret.add(t);
    
    return ret.toArray(new String[]);

由于myriad issues with generic arrays in Java,,编写此函数的通用版本有点困难,所以请轻举妄动。

【讨论】:

【参考方案4】:

在 Guava 中使用Iterables.toArray(Iterable&lt;? extends T&gt; iterable, Class&lt;T&gt; type) 方法。

【讨论】:

Iterables#toArray 不公开 你知道有没有像这样但没有番石榴的单一代码? @guai 只是为了他人的利益,类型类没有第二个参数的 Iterables.toArray 是私有的。上面带有这个参数的方法是公开的。 到 arr [] 的转换非常慢。它带走了您获得的所有速度优势.. 例如,一个 500k 拆分循环(约 300 个值)在转换为 arr [] 时在 50ms 内完成,在大约 6000ms 内完成【参考方案5】:

尽管问题是“将迭代器转换为数组”,但答案仅说明了如何将 Iterable 转换为数组。

因此,要使用 Guava 将 Iterator 转换为 Array,您可以使用 Iterators.toArray(Iterator&lt;? extends T&gt; iterator, Class&lt;T&gt; type)

【讨论】:

【参考方案6】:

在番石榴中,您可以将其转换为Follows

 String test= "Welcome to java world";
 Iterable<String> tokens=Splitter.on(" ").split(test);
 String array[]=Iterables.toArray(tokens,String.class);

如果您只想像访问数组一样访问迭代器元素,则无需转换。您可以通过索引直接访问这些元素

例如

 System.out.println(Iterables.get(tokens,2));

【讨论】:

【参考方案7】:

你也可以使用Guava的FluentIterable:

FluentIterable.from(Splitter.on(":").split(mystring)).toArray(String.class)

【讨论】:

【参考方案8】:

如果您使用普通的 Java String.split(regex) 方法,那就没问题了。它返回一个字符串[]。

"my;string".split(";")

String[] splits = mystring.split(";");

如果不需要,不要使用花哨的库。

【讨论】:

以上是关于使用 Guava 将 Iterable 转换为数组的主要内容,如果未能解决你的问题,请参考以下文章

培训日报3.14(mysql,guava,穿山甲等)

将数组转换为 ES6 可迭代

Python中的iterable该怎么理解

将 Guava 谓词转换为 Java 8 谓词

将 Scala Iterable[T] 转换为 Option[Iterable[S]],如果所有 T 都是 S 的实例,则填充?

Guava集合--集合扩展工具类