public static <T> ArrayBatchRecords<T> forRecords(
            String splitId,
            Pool.Recycler<T[]> recycler,
            T[] records,
            int numberOfRecords,
            int fileOffset,
            long startingRecordOffset) {
        return new ArrayBatchRecords<>(
                splitId,
                recycler,
                records,
                numberOfRecords,
                fileOffset,
                startingRecordOffset,
                Collections.emptySet());
    }
Create a ArrayBatchRecords backed up an array with records from the same file

@param splitId Iceberg source only read from one split a time. We never have multiple records
    from multiple splits.
@param recycler Because {@link DataIterator} with {@link RowData} returns an iterator of reused
    RowData object, we need to clone RowData eagerly when constructing a batch of records. We
    can use object pool to reuse the RowData array object which can be expensive to create.
    This recycler can be provided to recycle the array object back to pool after read is
    exhausted. If the {@link DataIterator} returns an iterator of non-reused objects, we don't
    need to clone objects. It is cheap to just create the batch array. Hence, we don't need
    object pool and recycler can be set to null.
@param records an array (maybe reused) holding a batch of records
@param numberOfRecords actual number of records in the array
@param fileOffset fileOffset for all records in this batch
@param startingRecordOffset starting recordOffset
@param <T> record type
inlong-sort/sort-flink/sort-flink-v1.15/sort-connectors/iceberg/src/main/java/org/apache/inlong/sort/iceberg/source/reader/ArrayBatchRecords.java