使用 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< Element >
并将其转换为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<String>
转换为类似这样的数组
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<? extends T> iterable, Class<T> type)
方法。
【讨论】:
Iterables#toArray 不公开 你知道有没有像这样但没有番石榴的单一代码? @guai 只是为了他人的利益,类型类没有第二个参数的 Iterables.toArray 是私有的。上面带有这个参数的方法是公开的。 到 arr [] 的转换非常慢。它带走了您获得的所有速度优势.. 例如,一个 500k 拆分循环(约 300 个值)在转换为 arr [] 时在 50ms 内完成,在大约 6000ms 内完成【参考方案5】:尽管问题是“将迭代器转换为数组”,但答案仅说明了如何将 Iterable 转换为数组。
因此,要使用 Guava 将 Iterator 转换为 Array,您可以使用 Iterators.toArray(Iterator<? extends T> iterator, Class<T> 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 转换为数组的主要内容,如果未能解决你的问题,请参考以下文章
将 Scala Iterable[T] 转换为 Option[Iterable[S]],如果所有 T 都是 S 的实例,则填充?