code: public static <T> List<List<T>> chop(Iterator<T> self, int... chopSizes) {
          List<List<T>> result = new ArrayList<List<T>>();
          for (Integer nextSize : chopSizes) {
              int size = nextSize;
              List<T> next = new ArrayList<T>();
              while (size-- != 0 && self.hasNext()) {
                  next.add(self.next());
              }
              result.add(next);
          }
          return result;
      }
docs: Chops the iterator items into pieces, returning lists with sizes corresponding to the supplied chop sizes.
  If the iterator is exhausted early, truncated (possibly empty) pieces are returned.
  Using a chop size of -1 will cause that piece to contain all remaining items from the iterator.
  
  @param self      an Iterator to be chopped
  @param chopSizes the sizes for the returned pieces
  @return a list of lists chopping the original iterator elements into pieces determined by chopSizes
  @since 2.5.2