情景1:
我从某处获得了Set<CharSequence>
,这意味着我无法控制如何创建此集。
Set<CharSequence> dataSet = GET_DATA_SET();
我想将数据从Set<CharSequence>
转换为Set<String>
。有没有一种有效的方法来进行这种转换而不对每个元素进行迭代?
情景2:
我还得到另一个数据HashMap
类型(同样,我无法控制此地图数据的创建部分):
Map<CharSequence, Car> dataMap = GET_DATA_MAP();
是否有一种有效的方法可以将此地图转换为Map<String, Car>
而无需迭代?
答案 0 :(得分:1)
提及 Eng.Fouad 并非所有CharSequence
都是String
。
所以我们必须调用toString()
方法。
只需使用:
Set<CharSequence> dataSet = new HashSet<CharSequence>(Arrays.asList("a","b"));
Set<String> output = new HashSet<String>();
for(CharSequence c : dataSet){
output.add(c.toString());
}
非常简单明了
答案 1 :(得分:1)
如果你确定该对象是String
s,那么你可以进行(未经检查)演员表,如果你假设出错了,你将获得ClassCastException
:
Map<CharSequence, Object> dataMap = new HashMap<>();
@SuppressWarnings("rawtypes")
Map untypedDataMap = dataMap;
@SuppressWarnings("unchecked")
Map<String, Object> stringDataMap = untypedDataMap;
请注意,这是非常危险的,特别是如果Map
来自外部库。我会遍历Map
以将每个CharSequence
转换为String
。
你的问题是基于假设循环效率低下,但你确定吗?在你的情况下,它会是一个什么问题?现代编译器和硬件非常有效,甚至可能没有注意到循环的差异。
答案 2 :(得分:0)
如果您确定没有非字符串对象,只需使用
将对象转换为Set<String>
(Set<String>)((Object)dataSet);
示例:
(Set<String>)((Object)new HashSet<CharSequence>()));
但这是非常脏和不安全的技巧。
编辑: 正如@LaurentG所提到的,你可以做到
(Set<String>)((Set)dataSet);
答案 3 :(得分:0)
尝试
Set<String> dataSet = (Set<String>)(Set)GET_DATA_SET();
答案 4 :(得分:0)
您可以使用此通配符:
Set<? extends CharSequence> dataSet;
Map<? extends CharSequence, Car> dataMap;
这是安全的。但是你必须记住你的方法可能会返回对象,你将无法将其转换为CharSequence的一些继承人
答案 5 :(得分:0)
不确定在java核心中是否可以不进行迭代。也许,你可以使用番石榴来做到这一点。请查看Lists.transform
和Collections2.transform