回答一位网友对Scala的提问

本文深入解析Scala中Map的flatMap和map方法的区别与应用场景,通过示例代码帮助理解如何利用这些方法进行高效的数据处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本来准备在私信里直接回复了,但是发现不太方便,就简要回答在这里。

问题 写道
对于scala的简洁十分佩服,但又觉得比较晦涩,例如一例,Map("a" -> List(11,111)).flatMap(_._2),可否说下最后那个函数做了什么,真正在开发的时候也会如此简洁?谢谢

   先回答一点,在实际使用中,Scala毫无疑问就是这么简单。

    首先

Map("a" -> List(11,111)).flatMap(_._2)   //List(11, 111)

   为什么能以_._2调用是因为 -> 标识符产生的是一个Tuple2对象(包含有两个元素的元组,如(1,2))   

 

def -> [B](y: B): Tuple2[A, B] = Tuple2(x, y)

  而Tuple2对象就可以分别使用_1,_2来调用第一第二个元素。

   回过来看 (☆)

Map("a" -> List(11,111)).map(_._2)  //List(List(11, 111))

这里_._2就相当于是取得元组("a",List(11,111))的第二个元素即List(11, 111)

为什么会又多出一个List? 看下scala.collection.immutable.Map的map方法的定义:

 

  def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That ={
    val b = bf(repr)
    b.sizeHint(this)
    for (x <- this) b += f(x)
    b.result
  }

 

    具体不解释了,顺着上面的方法看下去就知道了。稍微提示一下,(☆)那部分代码带着-Xprint:typer编译的部分结果是:

 

scala.this.Predef.Map.apply[java.lang.String, List[Int]](scala.this.Predef.any2ArrowAssoc[java.lang.String]("a").->[List[Int]](immutable.this.List.apply[Int](11, 111))).map[List[Int], scala.collection.immutable.Iterable[List[Int]]](((x$1: (java.lang.String, List[Int])) => x$1._2))(immutable.this.Iterable.canBuildFrom[List[Int]])

   而flatMap只是在输出结果时会调用 ++= 而已

 

譬如

val l1 = List(1,2,3)
val l2 = List(4,5,6)
val l3 = List(7,8,9)
	
val bigList = List(l1,l2,l3)
	
println(bigList) //List(List(1, 2, 3), List(4, 5, 6), List(7, 8, 9))
	
val lb = scala.collection.mutable.ListBuffer[Int]()
	
bigList.foreach(xs =>lb ++= xs)
	
println(lb.toList) //List(1, 2, 3, 4, 5, 6, 7, 8, 9)

 事实上也就是走到:

 def ++=(xs: TraversableOnce[A]): this.type = { xs.seq foreach += ; this }

 

 

所以自己可以思考一下下面代码的结果:

    val rs1 = Map("a" -> List(List(11),List(111))).map(_._2)
    val rs2 = Map("a" -> List(List(11),List(111))).flatMap(_._2)
    val rs3 = Map("a" -> List(11), "b" -> List(111)).flatMap(_._2)

List(List(List(11), List(111)))

List(List(11), List(111))

List(11, 111)

以为着即使flat也不能把把嵌套List的压平。

 

码了半小时的字,有没有效果啊?

 

内容概要:本文详细阐述了DeepSeek大模型在服装行业的应用方案,旨在通过人工智能技术提升服装企业的运营效率和市场竞争力。文章首先介绍了服装行业的现状与挑战,指出传统模式难以应对复杂的市场变化。DeepSeek大模型凭借其强大的数据分析和模式识别能力,能够精准预测市场趋势、优化供应链管理、提升产品设计效率,并实现个性化推荐。具体应用场景包括设计灵感生成、自动化设计、虚拟试衣、需求预测、生产流程优化、精准营销、智能客服、用户体验提升等。此外,文章还探讨了数据安全与隐私保护的重要性,以及技术实施与集成的具体步骤。最后,文章展望了未来市场扩展和技术升级的方向,强调了持续优化和合作的重要性。 适用人群:服装行业的企业管理层、技术负责人、市场和销售团队、供应链管理人员。 使用场景及目标:①通过市场趋势预测和用户偏好分析,提升设计效率和产品创新;②优化供应链管理,减少库存积压和生产浪费;③实现精准营销,提高客户满意度和转化率;④通过智能客服和虚拟试衣技术,提升用户体验;⑤确保数据安全和隐私保护,建立用户信任。 阅读建议:此资源不仅涵盖技术实现的细节,还涉及业务流程的优化和管理策略的调整,建议读者结合实际业务需求,重点关注与自身工作相关的部分,并逐步推进技术的应用和创新。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值