[spark-4691][shuffle]code optimization for judgement

In HashShuffleReader.scala and HashShuffleWriter.scala, no need to judge "dep.aggregator.isEmpty" again as this is judged by "dep.aggregator.isDefined"

In SortShuffleWriter.scala, "dep.aggregator.isEmpty"  is better than "!dep.aggregator.isDefined" ?


Could also write this as

```scala
if (dep.aggregator.isDefined) {
  ...
} else {
  require(!dep.mapSideCombine, "Map-side combine requested without Aggregator specified!")

  // Convert the Product2s to pairs since this is what downstream RDDs currently expect
  iter.asInstanceOf[Iterator[Product2[K, C]]].map(pair => (pair._1, pair._2))
}
```