有没有一种简单的方法可以在不遍历整个集合的情况下将Set<Integer>
转换为Set<String>
?
No.最好的方法是循环。
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()));
或者,使用流,
Set<String> strs = ints.stream().map(Integer::toString).collect(toSet());
使用 Java8 流图并收集能力:
Set< String > stringSet =
intSet.stream().map(e -> String.valueOf(e)).collect(Collectors.toSet());
No.您必须格式化每个整数并将其添加到字符串集中。
如果您真的不想遍历整个集合,则可以使用装饰器
你可以使用 Commons Collections 的 TransformedSet 或 Guava's Collections2.transform(...)
在这两种情况下,您的函子可能只是简单地调用 Integer 的 toString()。
自己实现Set<String>
并将所有调用重定向到原始集,仅在需要时处理必要的转换。根据该集的使用方式,性能可能会明显更好或明显更差。
AFAIK,你必须遍历集合;特别是当涉及到不自然的转换时,即如果你试图从 Set-Timestamp- 转换为 Set-Date-;你可以使用 Java 泛型的某种组合来实现这一点(因为时间戳可以强制转换为 Date)。但由于 Integer 不能强制转换为 String,因此您需要迭代。
将 Eclipse Collections 与 Java 8 结合使用:
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 的提交者。
private static <T> Set<T> toSet(Set<?> set) {
Set<T> setOfType = new HashSet<>(set.size());
set.forEach(ele -> {
setOfType.add((T) ele);
});
return setOfType;
}
7 + Guava(大概没有办法切换到Java 8)。
new HashSet<>(Collections2.transform(<your set of Integers>, Functions.toStringFunction()))