将Iterator<Object>
投射到Set<String>
什么是最干净/最佳的做法?
答案 0 :(得分:7)
public Set<B> getBs(){
Iterator<A> iterator = myFunc.iterator();
Set<B> result = new HashSet<B>();
while (iterator.hasNext()) {
result.add((B) iterator.next();
}
return result;
}
但是,如果迭代器返回的所有A
都不是B
,那么它将会失败。
如果要过滤迭代器,请使用instanceof:
public Set<B> getBs(){
Iterator<A> iterator = myFunc.iterator();
Set<B> result = new HashSet<B>();
while (iterator.hasNext()) {
A a = iterator.next();
if (a instanceof B) {
result.add((B) iterator.next();
}
}
return result;
}
使用番石榴,上面的内容可以简化为
return Sets.newHashSet(Iterators.filter(myFunc.iterator(), B.class));
答案 1 :(得分:3)
如果我们讨论需要使用它们的iterators
和collections
,并且您需要iterater
足够通用,以便它可以被不同的{{1}使用}。
只需使用collections
if/else
关键字,如下所示:
instanceof
答案 2 :(得分:3)
我仍然不能100%确定你想要什么,但看看这个并看到:
public static void main(String[] args) {
final Iterator<?> it = Arrays.asList(new Object[] {"a", "b", "c"}).iterator();
System.out.println(setFromIterator(it));
}
public static Set<String> setFromIterator(Iterator<?> it) {
final Set<String> s = new HashSet<String>();
while (it.hasNext()) s.add(it.next().toString());
return s;
}
答案 3 :(得分:1)
这可能是唯一的方法。
while(iterator.hasNext()) {
Object o = iterator.next();
if (o instanceof B) {
collection.add((B) o);
}
}
答案 4 :(得分:1)
org.apache.commons.collections.IteratorUtils
可用于执行此操作。
以下是将迭代器转换为set;
的示例Set<String> mySet = new HashSet<String>(IteratorUtils.toList(myIterator))
答案 5 :(得分:0)
您无法将Iterator强制转换直接设置。 Iterator模式提供了顺序访问聚合对象元素的方法,而不会暴露其底层表示。可能的解决方案是顺序遍历每个元素并将每个元素添加到集合
while (iterator.hasNext()) {
Object obj = iterator.next();
set.add(obj.toString());
}