@Override
    public RecordsWithSplitIds<MixedFormatRecordWithOffset<T>> next() {
      if (!inputIterator.hasNext()) {
        throw new NoSuchElementException();
      }

      T[] batch = getCachedEntry();
      int recordCount = 0;

      RecordPosition[] positions = initPositionArray();
      while (inputIterator.hasNext() && recordCount < batchSize) {
        // The record produced by inputIterator can be reused like for the
        // MixedFormatRecordWithOffset
        // case.
        // inputIterator.next() can't be called again until the copy is made
        // since the record is not consumed immediately.
        T nextRecord = inputIterator.next();
        recordFactory.clone(nextRecord, batch, recordCount);
        positions[recordCount].set(inputIterator);
        recordCount++;
        if (!inputIterator.currentFileHasNext()) {
          // break early so that records in the ArrayResultIterator
          // have the same fileOffset.
          break;
        }
      }
      return ArrayBatchRecords.forRecords(splitId, pool.recycler(), batch, recordCount, positions);
    }
This implementation stores record batch in array from recyclable pool
amoro-format-mixed/amoro-mixed-flink/amoro-mixed-flink-common/src/main/java/org/apache/amoro/flink/read/hybrid/reader/ArrayPoolDataIteratorBatcher.java