flatMap与scala中的地图

时间:2018-05-23 04:01:04

标签: scala

为什么这不起作用:

val m = Map( 1-> 2, 2-> 4, 3 ->6)
def h(k: Int, v: Int) = if (v > 2) Some(k->v) else None
m.flatMap { case(k,v) => h(k,v) }
m.flatMap { (k,v) => h(k,v) }

case语句的那个​​给了我:

res1: scala.collection.immutable.Map[Int,Int] = Map(2 -> 4, 3 -> 6)

但另一个失败并说MIssing Type parameter vexpected: Int, actual:(Int, Int)

2 个答案:

答案 0 :(得分:4)

case关键字表示模式匹配,因此Tuple2(一个MapIterableTuple2个元素)您平坦地“覆盖”被分解为k和v。(当flatMap函数产生h而不是OptionMapIterable工作的事实是Scala集合库可能过于宽松。)

如果没有case关键字,则提供需要两个参数的函数,但flatMap需要一个接受单个参数的函数(Tuple2)。所以第二个版本没有进行类型检查。

答案 1 :(得分:0)

对于第二个,如果您不想使用<select name="buyer"> @foreach(['buyer1', 'buyer2', 'buyer3'] as $buyer) <option vlaue="{{ $buyer }}"{{ ($order->buyer == $buyer) ? ' selected' : '' }}>{{ $buyer }}</option> @endforeach </select> ,则可以执行此操作。

case