6

私は成功せずにこれらの3つのコードを書き込もうとしました:

aList.foldLeft(List()){(accu, element) => map.get(elment):::accu}
aList.foldLeft(List()){(accu, element) => if (!map.get(element).isEmpty) map.get(element):::accu}
aList.foldLeft(List()){(accu, element) => map.get(elment).exists(_:::accu)}

オプションをリストに連結する方法を知っている人はいますか?

4

4 に答える 4

26

オプションとリストを連結するには、次のことができますoption.toList ++ list

とを連結するOption[List[A]]にはList[A] optionOfList.toList.flatten ++ list

基本的な考え方は、いつでもオプションを 0 または 1 つの要素のリストに変換できるということです。これにより、それらをさまざまな方法でリストと簡単に組み合わせることができます。

于 2012-10-13T04:12:56.207 に答える
1

scalaz をふりかける:

import scalaz._; import Scalaz._

そしてセットアップ:

scala> val optList = some(List(1, 2, 3, 4)
optList: Option[List[Int]] = Some(List(1, 2, 3, 4))

scala> val list = List(5, 6, 7)
list: List[Int] = List(5, 6, 7)

それから私はすることができます:

scala> ~optList ::: list
res0: List[Int] = List(1, 2, 3, 4, 5, 6, 7)

基本的には、 typeのゼロがある場所に~接続された単項メソッドです。リストのゼロはもちろん、Option[A]ANil

于 2012-10-13T11:18:00.020 に答える
0

@oxbow_lakesと@rjsvaljeanによる回答は非常に優れていますが、非常に慣用的なScalaで解決できる可能性のある1つのケースを見逃しています。

scala> List(1,2,3)
res6: List[Int] = List(1, 2, 3)

scala> Option(List(5,6,7))
res7: Option[List[Int]] = Some(List(5, 6, 7))

scala> for (l<-res7) yield l ++ res6
res8: Option[List[Int]] = Some(List(5, 6, 7, 1, 2, 3))

scala> for(l<-(None:Option[List[Int]])) yield l ++ res6
res9: Option[List[Int]] = None

上記のコードで示されている欠落しているケースは、 ?の代わりにNoneyieldである必要があります。NoneNil

于 2012-10-13T11:31:53.800 に答える