It would be great if you could add some documentation to hasNext, since this is not a usual hasNext iterator call. This call itself actually has side effects. For the code to be more readable, I would suggest commenting on each if branch to explain the situation.

E.g. 

```scala
if (currentIterator.hasNext) {
  // If the current iterator has element, just return true
  true
} else {
  // Otherwise, move to the next partition and check if there is any element in there.
  //  Also prefetch one more partition.
  ...
}

```