【发布时间】:2011-08-22 16:33:27
【问题描述】:
有没有一种简单的方法可以将Set<Integer> 转换为Set<String> 而无需遍历整个集合?
【问题讨论】:
-
和
Lists 大同小异:stackoverflow.com/questions/18524/…
有没有一种简单的方法可以将Set<Integer> 转换为Set<String> 而无需遍历整个集合?
【问题讨论】:
Lists 大同小异:stackoverflow.com/questions/18524/…
没有。最好的方法是循环。
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());
【讨论】:
toString 而不是 stringValue ;)
Integer的.intValue()。
toString() 的调用中抛出NullPointerException,因为Set<T> 可以包含空值。
""+integer ;)
使用 Java8 流图并收集能力:
Set< String > stringSet =
intSet.stream().map(e -> String.valueOf(e)).collect(Collectors.toSet());
【讨论】:
在 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 的提交者。
【讨论】:
Java 7 + Guava(估计没办法切换到 Java 8)。
new HashSet<>(Collections2.transform(<your set of Integers>, Functions.toStringFunction()))
【讨论】:
private static <T> Set<T> toSet(Set<?> set) {
Set<T> setOfType = new HashSet<>(set.size());
set.forEach(ele -> {
setOfType.add((T) ele);
});
return setOfType;
}
【讨论】:
AFAIK,您必须遍历集合;尤其是当涉及不自然的转换时。即,如果您尝试从 Set-Timestamp- 转换为 Set-Date-;您可以使用 Java 泛型的某种组合来实现这一点(因为时间戳可以转换为日期)。但是由于 Integer 不能转换为 String,所以需要迭代。
【讨论】:
您可以自己实现Set<String> 并将所有调用重定向到原始集合,仅在需要时处理必要的转换。取决于该组的使用方式,它的表现可能明显更好或更差。
【讨论】:
您可以使用 Commons Collections 的 TransformedSet 或 Guava 的 Collections2.transform(...)
在这两种情况下,您的仿函数可能会简单地调用整数的 toString()。
【讨论】:
如果你真的不想遍历整个集合,你可以使用装饰器
【讨论】:
没有。您必须格式化每个整数并将其添加到您的字符串集中。
【讨论】: