scala groupBy是怎么分组的?

  val partitionsPerFetcher = partitionAndOffsets.groupBy{ case(topicAndPartition, brokerAndInitialOffset) =>
      BrokerAndFetcherId(brokerAndInitialOffset.broker, getFetcherId(topicAndPartition.topic, topicAndPartition.partition))}

这段代码是什么意思。。 scala不是很熟,我网上看到groupBy是对list按照函数进行分组,但是这个是怎么分的呢?

阅读 12.7k
1 个回答
groupBy[K](f: (A) ⇒ K): immutable.Map[K, Repr]

可看出来groupBy的参数是一个 (A) => K 的函数,即有一个输入和一个输出的函数

我们做一个小测试

val z: Map[Int, Seq[String]] = Seq("a", "b", "c", "d").groupBy[Int] { x => 
  x match {
    case "a" => 1
    case "b" => 1
    case _ => 2
  }
}
println(z)
// print: Map(2 -> List(c, d), 1 -> List(a, b))

很明显(A) => K 中A即Seq中的每项,而K为该项对应的key,Scala根据这个函数返回的key,判断那些项是一组的

上面代码可以写成这样

val z: Map[Int, Seq[String]] = Seq("a", "b", "c", "d").groupBy[Int] {
  case "a" => 1
  case "b" => 1
  case _ => 2
}

所以你的代码

val partitionsPerFetcher = partitionAndOffsets.groupBy{ 
  case(topicAndPartition, brokerAndInitialOffset) =>
      BrokerAndFetcherId(brokerAndInitialOffset.broker, getFetcherId(topicAndPartition.topic, topicAndPartition.partition))
}

partitionAndOffsets是一个Seq[(topicAndPartition, brokerAndInitialOffset)]这样的一个二元组序列
而每项的key为BrokerAndFetcherId(brokerAndInitialOffset.broker, getFetcherId(topicAndPartition.topic, topicAndPartition.partition))

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进