我有一个关于将结果设置为空(即没有)的问题,我在过去的问题中进行了研究,但没有找到一个好的解决方案。
问题很简单,比如我有一个Int列表和Bool列表
val a = List(1,2,3,4,5)
val b = List(F,T,T,F,F)
我想拉链并做一些映射:
val result = (a,b).zipped.map((x,y)=>(if(b) a else ())
我假设我正在做上面正确的事情,它接受a和b的每个元素并执行操作,如果b为真,则返回a,否则不返回任何内容。我希望结果只有数字(2,3)。但是,我的Eclipse似乎表明生成的结果是List [AnyVal]而不是List [Int]。
我已经测试了相同的设置,但是使用了Lists,当我将b设置为List()时,该过程正常工作,Eclipse正在理解我想要设置一个空List,所以当我错误时我迷失了...
提前致谢
答案 0 :(得分:3)
你想要val result = (a zip b).filter(_._2).map(_._1)
。 map
永远不会过滤,因此请勿尝试从其参数返回()
,并希望它会过滤。
答案 1 :(得分:1)
val a = List(1, 2, 3, 4, 5)
val b = List(false, true, true, false, false)
a.zip(b) // zip two lists
.filter(_._2) // filter if second element is true
.map(_._1) // grab first element of tuple
// List[Int] = List(2, 3)
答案 2 :(得分:0)
您还可以使用collect
,它只会保留与模式匹配的元素。您可以将其视为map
,它会丢弃未定义的任何内容。
val a = List(1, 2, 3, 4, 5)
val b = List(false, true, true, false, false)
(a zip b) collect { case (x, true) => x }