在讨论MONAD时遇到过这个问题,虽然有点难以理解。但问题是,我可以使用大数据获取地图和平面图,但这里的东西让我觉得非常不稳定。 firstname =>姓氏,复合=>等等没有得到它...谁能解释?它虽然有效。
val maybeFirstName = Option("Joe");
val maybeLastName = Option("Black");
val maybeFullName = maybeFirstName.flatMap { firstName =>
maybeLastName.map { lastName =>
firstName + " " + lastName
}
}
答案 0 :(得分:0)
Map在maybeLastName和returns Option或Option(Joe Black)
上应用函数。因此,如果使用map而不是flatMap,则会获得Option(Option(Joe Black))
,因为map始终返回新的Option,因此要删除内部选项,您需要使用flatMap或组合映射并展平。
在这里,您可以了解flatten
的工作原理答案 1 :(得分:0)
与许多复合操作一样,从内到外解读它有时是有意义的。
maybeLastName.map(lastName => /*some op on lastName*/)
map()
打开Option
并将值(如果它在那里)分配给lastName
。如果Option
为None
,则表示没有lastName
且没有操作。如果Option
不是None
,则执行操作并将结果重新包装到Option
。
flatMap()
做同样的事情,除了它不重新包装结果。相反,op inside需要返回一个已经包裹的值,即Option
。
所以,回顾一下:
maybeFirstName.flatMap { firstName => //op on firstName must return Option
maybeLastName.map { lastName => //op on lastName should not return Option
/* op */
}
}
如果maybe...Name
为None
,则最终结果为None
。