有没有一种简单的方法可以将Set<Integer>
转换为Set<String>
而无需遍历整个集合?
答案 0 :(得分:9)
没有。最好的方法是循环。
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()));
答案 1 :(得分:8)
使用Java8流图并收集能力:
Set< String > stringSet =
intSet.stream().map(e -> String.valueOf(e)).collect(Collectors.toSet());
答案 2 :(得分:6)
没有。您必须格式化每个整数并将其添加到字符串集。
答案 3 :(得分:2)
如果你真的不想遍历整个集合
,你可以使用装饰器答案 4 :(得分:2)
你可以使用Commons Collections'TransformedSet或Guava的Collections2.transform(...)
在这两种情况下,您的仿函数可能只是简单地调用Integer的toString()。
答案 5 :(得分:1)
AFAIK,你必须遍历集合;特别是当涉及的转换不自然时。即如果您尝试从Set-Timestamp-转换为Set-Date-;您可以使用Java Generics的某些组合来实现这一点(因为Timestamp可以转换为Date)。但由于Integer无法转换为String,因此需要进行迭代。
答案 6 :(得分:1)
您可以自己实施Set<String>
并将所有调用重定向到原始集,仅在需要时处理必要的转换。取决于该组的使用方式,可能表现得更好或更差。
答案 7 :(得分:1)
在Java 8中使用Eclipse Collections:
Set<String> strings = IntSets.mutable.with(1, 2, 3).collect(String::valueOf);
这并不需要装箱int值和Integer,但如果需要你也可以这样做:
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的提交者。
答案 8 :(得分:0)
private static <T> Set<T> toSet(Set<?> set) {
Set<T> setOfType = new HashSet<>(set.size());
set.forEach(ele -> {
setOfType.add((T) ele);
});
return setOfType;
}
答案 9 :(得分:0)
Java 7 + Guava(可能无法切换到Java 8)。
new HashSet<>(Collections2.transform(<your set of Integers>, Functions.toStringFunction()))