@Override
        public ElementType next() {
            // if not initialized, initialize it first
            if (this.currentElementItr == null) {
                if (this.currentListItr.hasNext()) { // have lists
                    this.currentElementItr = this.currentListItr.next()
                            .iterator();
                } else {
                    throw new NoSuchElementException();
                }
            }
            // initialized, and has next element
            if (this.currentElementItr.hasNext()) {
                return this.currentElementItr.next();
            }
            // initialized, but doesn't has next element
            if (this.currentListItr.hasNext()) {
                // get next list to iterate
                this.currentElementItr = this.currentListItr.next().iterator();
                return this.currentElementItr.next();
            } else {
                throw new NoSuchElementException(
                        "Iteration has no more elements, You should check hasNext() before iterator it");
            }
        }