Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why Iterators.size() making the iterator empty?

public static void main(String args[]) throws JSONException {
    JSONObject json = new JSONObject();
    json.put("name", "abcgdj");
    json.put("no", "1234");
    json.put("contact", "6748356");
    Iterator<?> keys = json.keys();
    System.err.println(Iterators.size(keys));
    System.err.println(Iterators.size(keys));
}

In this code, after executing Iterators.size(keys), the iterator is becoming empty and for the second print statement, it returning 0.

The size() method is under the package com.google.common.collect.iterators.So I've looked the code of Iterators.size() function.It was,

 public static int size(Iterator<?> iterator) {
    long count = 0L;
    while (iterator.hasNext()) {
    iterator.next();
    count++;
  }
  return Ints.saturatedCast(count);
}

So I have a doubt that how the iterator keys becomes empty. whether it is called by reference?

Can anyone explain what's happening inside size() function

like image 875
Nambi_0915 Avatar asked Sep 18 '18 12:09

Nambi_0915


1 Answers

System.err.println(Iterators.size(keys));

As it says in the Javadoc, this exhausts the keys iterator: it just keeps calling next() until hasNext() is false.

Then it's not reset before you call

System.err.println(Iterators.size(keys));

again (because there's no way to reset an iterator). So hasNext() immediately returns false, so there are no more elements for it to read. Hence the size is zero.

You'd need to reassign the variable with a new iterator:

Iterator<?> keys = json.keys();
System.err.println(Iterators.size(keys));

keys = json.keys();  //

System.err.println(Iterators.size(keys));

or don't declare a variable (since it's effectively (*) useless afterwards):

System.err.println(Iterators.size(json.keys()));
System.err.println(Iterators.size(json.keys()));    

(*) You could use it to remove the last element of the iterator.

like image 91
Andy Turner Avatar answered Sep 20 '22 04:09

Andy Turner