scala flatmap

本文详细解析了List中map和flatMap方法的区别与联系。map方法将集合中的每个元素转换为另一个新对象;而flatMap则将每个元素转换为一个新的集合,并将这些集合合并成一个大的集合。通过具体的代码示例,展示了这两种方法的应用场景。

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

/ 看一下List中map和flatMap的实现就一目了然: 
abstract class List[T]{
  def map[U](f: T => U): List[U] = this match {
    case first :: last = f(first) :: last.map(f)
    case Nil = Nil
 }

  def flatMap[U](f: T => List[U]): List[U] = this match{
    case x:: xs => f(x) ++ xs.flatMap(f)
    case Nil => Nil
  }
}

总结:1. map会将每一条输入映射为一个新对象。{苹果,梨子}.map(去皮) = {去皮苹果,去皮梨子} 其中: “去皮”函数的类型为:A => B

2.flatMap包含两个操作:会将每一个输入对象输入映射为一个新集合,然后把这些新集合连成一个大集合。 {苹果,梨子}.flatMap(切碎) = {苹果碎片1,苹果碎片2,梨子碎片1,梨子碎片2} 其中: “切碎”函数的类型为: A => List<B>

 

作者:知乎用户
链接:https://www.zhihu.com/question/34548588/answer/63053302
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

flatMap “函数的一半功能和map函数一样,不过有个要求,传入的函数在处理完后返回值必须是List(应该是Seq),如果结果不是List(Seq),那么将出错。也就是说,传入的函数是有要求的——返回值是Seq才行。这样,每个元素处理后返回一个List,我们得到一个包含List元素的List,flatMap自动将所有的内部list的元素取出来构成一个List返回。 sample:
var li= List(1,2,3,4)
li.flatMap(x => x match {
     case 3 => List(3.1,3.2)
     case _ => x*2
  })

//结果=>
main.scala:4: error: type mismatch;
 found   : Int
 required: scala.collection.GenTraversableOnce[?]
      case _ => x*2


传入flatMpa的函数返回值必须是List,将x*2改成List(x*2),并且和map函数对比一下,看结果:

var li= List(1,2,3,4)
var res = li.flatMap(x => x match {
     case 3 => List(3.1,3.2)
     case _ => List(x*2)
  })
println(res)
li= List(1,2,3,4)
var  res2 = li.map(x => x match {
     case 3 => List(3.1,3.2)
     case _ => x*2
  })
println(res2)

//output=>
List(2, 4, 3.1, 3.2, 8)
List(2, 4, List(3.1, 3.2), 8)
Program exited.

转载于:https://www.cnblogs.com/sjj1022/p/8386767.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值