### What do you see as an issue?


The [documentation for Dynamic Task Mapping](https://airflow.apache.org/docs/apache-airflow/stable/authoring-and-scheduling/dynamic-task-mapping.html#simple-mapping
) does not include an example of a "reduce" task (e.g. `sum_it` in the [examples](https://airflow.apache.org/docs/apache-airflow/stable/authoring-and-scheduling/dynamic-task-mapping.html#simple-mapping)) using the classic (or non-TaskFlow) operators. It only includes an example that uses the TaskFlow operators.

When I attempted to write a "reduce" task using classic operators for my DAG, I found that there wasn't an obvious approach.

### Solving the problem

We should add an example of a "reduce" task that uses the classic (non-TaskFlow) operators.

For example, for the given `sum_it` example:

```
"""Example DAG demonstrating the usage of dynamic task mapping reduce using classic
operators.
"""
from __future__ import annotations

from datetime import datetime

from airflow import DAG
from airflow.decorators import task
from airflow.operators.python import PythonOperator


def add_one(x: int):
    return x + 1

def sum_it(values):
    total = sum(values)
    print(f"Total was {total}")


with DAG(dag_id="example_dynamic_task_mapping_reduce", start_date=datetime(2022, 3, 4)):
    add_one_task = PythonOperator.partial(
        task_id="add_one",
        python_callable=add_one,
    ).expand(
        op_kwargs=[
            {"x": 1},
            {"x": 2},
            {"x": 3},
        ]
    )

    sum_it_task = PythonOperator(
        task_id="sum_it",
        python_callable=sum_it,
        op_kwargs={"values": add_one_task.output},
    )
```

### Anything else

_No response_

### Are you willing to submit PR?

- [ ] Yes I am willing to submit a PR!

### Code of Conduct

- [X] I agree to follow this project's [Code of Conduct](https://github.com/apache/airflow/blob/main/CODE_OF_CONDUCT.md)

"""Unmap a deserialized mapped operator should be similar to deserializing an non-mapped operator."""
    normal = BashOperator(task_id="a", bash_command=[1, 2], executor_config={"a": "b"})
    mapped = BashOperator.partial(task_id="a", executor_config={"a": "b"}).expand(bash_command=[1, 2])
    serialize = SerializedBaseOperator.serialize
    deserialize = SerializedBaseOperator.deserialize_operator
    assert deserialize(serialize(mapped)).unmap(None) == deserialize(serialize(normal))
def test_sensor_expand_deserialized_unmap():
    """Unmap a deserialized mapped sensor should be similar to deserializing a non-mapped sensor"""
    normal = BashSensor(task_id="a", bash_command=[1, 2], mode="reschedule")
    mapped = BashSensor.partial(task_id="a", mode="reschedule").expand(bash_command=[1, 2])
    serialize = SerializedBaseOperator.serialize
    deserialize = SerializedBaseOperator.deserialize_operator
    assert deserialize(serialize(mapped)).unmap(None) == deserialize(serialize(normal))
def test_task_resources_serde():
    """
    Test task resources serialization/deserialization.
    """
    from airflow.operators.empty import EmptyOperator
    execution_date = datetime(2020, 1, 1)
    task_id = "task1"
    with DAG("test_task_resources", start_date=execution_date) as _:
        task = EmptyOperator(task_id=task_id, resources={"cpus": 0.1, "ram": 2048})
    serialized = SerializedBaseOperator.serialize(task)
    assert serialized["resources"] == {
        "cpus": {"name": "CPU", "qty": 0.1, "units_str": "core(s)"},
        "disk": {"name": "Disk", "qty": 512, "units_str": "MB"},
        "gpus": {"name": "GPU", "qty": 0, "units_str": "gpu(s)"},
        "ram": {"name": "RAM", "qty": 2048, "units_str": "MB"},
    }
def test_taskflow_expand_serde():