2016-03-18 35 views
0

Verilen isteğe bağlı koleksiyon

val optionalList: Option[List[Int]] = Some(List(1,2,3)) 

haritaya nasıl şu anda

optionalList.map(_.map(_ * 2)) 

gibi bir şey kullanarak elemanları harita I do not özellikle map(_.map( sözdizimi gibi. optionalList.mapValues(_ * 2) veya benzeri bir şey gibi daha iyi bir yaklaşım var mı? Eğer bir olmak istiyorsanız yaklaşık

+2

gibi bir şey düşünebilir _. harita (', kullanım sevmediğim map(_.map(_ * 2)) hangi bölümünün konusunda açık değildi Bu tanımlayıcıdır, insanlar ne anlama geldiğini anlamamaktadır, sihir yoktur. En az sürpriz ilke. –

+0

Yorumların herkese teşekkürler. Her zamanki gibi Orijinal optionalList.map (_. map (...) sözdizimi dahil olmak üzere, bununla uğraşmanın birçok geçerli yolu var gibi görünüyor. –

cevap

1

monad transformers, örn. scalaz ListT.

import scalaz._ 
import Scalaz._ 
import ListT._ 

val optionalList: Option[List[Int]] = Some(List(1,2,3)) 
val doubled = listT(optionalList).map(_ * 2).run 

ama sonunda

, ben klasik harita (_ ile sopa kadar basit bir durum için, Jean-Philippe tarafından önerildiği gibi harita (her skala programcı bir de ne anlama geldiğini bilir bakışta

0

Bu benim ile ...

implicit class OptionalSeq[I, O](input: Option[Seq[I]]) { 
    def mapContents(f: (I) => O): Option[Seq[O]] = { 
     input.map(_.map(f)) 
    } 
} 
... 
val optionalList: Option[Seq[Int]] = Some(Seq(1,2,3)) 
val doubled: Option[Seq[Int]] = optionalList.mapContents(_ * 2) 
1

geldi budur ben bu işlemek için örtük bir nesneyi yazmayı düşünmüştüm ama belki scala zaten bilmiyorum bir şey vardır biraz daha açık o zaman optionalList.map(_.map(_ * 2)) bunu nasıl yapacağım.

val doubled = optionalList match { 
    case Some(list) => Some(list.map(_ * 2)) 
    case None  => None 
} 

bu boş List yerine None ait kullanıyor 'çözmek' için başka bir yol. Bu sadece sorun alanınızda anlamlı ise işe yarayacaktır.

val doubled = optionalList.getOrElse(List.empty).map(_ * 2) 
+0

Öneriniz için teşekkürler –

1

sen. görsel yönü ise size `harita (sevmiyorum bile, for (list <- optionalList) yield list.map(_ * 2)

+0

Üzgünüz, tahmin ettiğin gibi sadece görsel yönü olduğunu açıklamalıydım. Bu, val a = 3 yerine val a = 1 + 2 yazmak gibi görünüyor. –