public Iterable<StopReplicaTopicState> topicStates() {
        if (version() < 1) {
            Map<String, StopReplicaTopicState> topicStates = new HashMap<>();
            for (StopReplicaPartitionV0 partition : data.ungroupedPartitions()) {
                StopReplicaTopicState topicState = topicStates.computeIfAbsent(partition.topicName(),
                    topic -> new StopReplicaTopicState().setTopicName(topic));
                topicState.partitionStates().add(new StopReplicaPartitionState()
                    .setPartitionIndex(partition.partitionIndex())
                    .setDeletePartition(data.deletePartitions()));
            }
            return topicStates.values();
        } else if (version() < 3) {
            return () -> new MappedIterator<>(data.topics().iterator(), topic ->
                new StopReplicaTopicState()
                    .setTopicName(topic.name())
                    .setPartitionStates(topic.partitionIndexes().stream()
                        .map(partition -> new StopReplicaPartitionState()
                            .setPartitionIndex(partition)
                            .setDeletePartition(data.deletePartitions()))
                        .collect(Collectors.toList())));
        } else {
            return data.topicStates();
        }
    }
Note that this method has allocation overhead per iterated element, so callers should copy the result into
another collection if they need to iterate more than once.

Implementation note: we should strive to avoid allocation overhead per element, see
`UpdateMetadataRequest.partitionStates()` for the preferred approach. That's not possible in this case and
StopReplicaRequest should be relatively rare in comparison to other request types.
clients/src/main/java/org/apache/kafka/common/requests/StopReplicaRequest.java