有没有一种简单的方法将 Set<Integer>
转换为 Set<String>
而不必遍历整个集合?
不,最好的方法是使用循环。
HashSet<String> strs = new HashSet<String>(ints.size());
for(Integer integer : ints) {
strs.add(integer.toString());
}
最好选择简单、相对快速、直接表达的方法。
(更新:) 在Java 8中,如果你想隐藏循环,可以使用Lambda表达式完成同样的事情。
HashSet<String> strs = new HashSet<>(ints.size());
ints.forEach(i -> strs.add(i.toString()));
或者,使用Streams:
Set<String> strs = ints.stream().map(Integer::toString).collect(toSet());
toString()
时可能会抛出 NullPointerException
,因为 Set<T>
可以包含空值。 - Luke Hutteman""+integer
;) - Peter LawreyString.valueOf(integer)
更快,并且具有与""+integer
相同的结果。 - Cajunlukeint[]
包装起来以将int
保存为原语类型。 - Peter Lawrey Set< String > stringSet =
intSet.stream().map(e -> String.valueOf(e)).collect(Collectors.toSet());
如果您真的不想遍历整个集合,可以使用装饰器。
Set<String>
,并在需要时进行必要的转换,同时将所有调用重定向到原始集合。根据集合的使用方式,这种方法可能表现得更好或更差。Set<String> strings = IntSets.mutable.with(1, 2, 3).collect(String::valueOf);
Set<String> strings = Sets.mutable.with(1, 2, 3).collect(String::valueOf);
Sets.mutable.with(1, 2, 3)
将返回一个MutableSet<Integer>
,而不像IntSets.mutable.with(1, 2, 3)
会返回一个MutableIntSet
。
注意:我是Eclipse Collections的提交者。
private static <T> Set<T> toSet(Set<?> set) {
Set<T> setOfType = new HashSet<>(set.size());
set.forEach(ele -> {
setOfType.add((T) ele);
});
return setOfType;
}
Java 7 + Guava(可能无法切换到Java 8)。
new HashSet<>(Collections2.transform(<your set of Integers>, Functions.toStringFunction()))
List
类似:https://dev59.com/tnVD5IYBdhLWcg3wU56H#61663 - Tom Hawtin - tackline