code: public Iterator<Symbol> iterator() {
          return new Iterator<Symbol>() {
  
              /** The next entry to examine, or null if none. */
              private Scope.Entry nextEntry = scope.elems;
  
              private boolean hasNextForSure = false;
  
              public boolean hasNext() {
                  if (hasNextForSure) {
                      return true;
                  }
                  while (nextEntry != null && unwanted(nextEntry.sym)) {
                      nextEntry = nextEntry.sibling;
                  }
                  hasNextForSure = (nextEntry != null);
                  return hasNextForSure;
              }
  
              public Symbol next() {
                  if (hasNext()) {
                      Symbol result = nextEntry.sym;
                      nextEntry = nextEntry.sibling;
                      hasNextForSure = false;
                      return result;
                  } else {
                      throw new NoSuchElementException();
                  }
              }
  
              public void remove() {
                  throw new UnsupportedOperationException();
              }
          };
      }
docs: A more efficient implementation than AbstractList's.