簡體   English   中英

投射Iterator的最佳方法 <Object> 到一套 <String> , 例如

[英]Best way to cast Iterator<Object> to a Set<String>, for instance

Iterator<Object>轉換為Set<String>

什么是最干凈/最佳實踐方式?

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));

如果我們談論的是iteratorscollections需要使用它們,你需要的iterater是通用足夠,以便它可以通過不同的使用collections
只需將if/elseinstanceof關鍵字一起使用,如下所示:

while(iterator.hasNext()) {
  Object obj = iterator.next();
  if (obj instanceof A) {
    collection.add((A) o);  
  } else if (obj instanceof B) {
    collection.add((B) o);  
  } else if ...etc
}

我仍然不是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;
}

那可能是唯一的方法。

while(iterator.hasNext()) {
  Object o = iterator.next();
  if (o instanceof B) {
    collection.add((B) o);  
  }
}

org.apache.commons.collections.IteratorUtils可用於執行此操作。

這是將迭代器轉換為set的示例;

Set<String> mySet = new HashSet<String>(IteratorUtils.toList(myIterator))

不能將 Iterator直接轉換為Set。 迭代器模式提供了一種順序訪問聚合對象元素的方法,而無需暴露其基礎表示。 可能的解決方案是依次移動每個元素並將每個元素添加到集合中

while (iterator.hasNext()) {
    Object obj = iterator.next();
    set.add(obj.toString());
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM