2015-01-30 8 views
9

Mam metodę, która powinna przekonwertować listę na Option obiektu lub None, jeśli lista jest pusta.Konwertuj listę do opcji, jeśli jest ona wypełniona

def listToOption(myList: List[Foo]): Option[Bar] = { 
    if(myList.nonEmpty) Some(Bar(myList)) 
    else None 
} 

case class Bar(fooList: List[Foo]) {} 

Z jakiegoś powodu moje rozwiązanie wydaje się raczej nieeleganckie, a nie sposób Scala. Wygląda na to, że powinienem móc użyć metody na List, żeby robić tego rodzaju rzeczy, ale nie mogę tego objąć.

Czy jest to sposób podobny do Scala?

+0

I pierwsza myśl, że chciałeś głowę listy, gdy są obecne, ale potem ponownie przeczytać swoje pytanie, naprawdę nie rozumiem, dlaczego chciałbyś to zrobić. Trudno znaleźć idiomatyczny sposób robienia rzeczy, gdy nie jest to typowa operacja. Byłoby miło, gdybyś mógł wyjaśnić, do czego zamierzasz użyć tej funkcji. –

+0

Z szerszej perspektywy było już dla mnie jasne, że mam problemy z projektowaniem w tej klasie, z którą pracuję, ale zdecydowałem się nie refaktoryzować klasy i zamiast tego staram się napisać coś eleganckiego, biorąc pod uwagę dziwne ograniczenia. Moje rozwiązanie "if-else" było po prostu słabe i pomyślałem, że może być lepszy sposób na zrobienie tego. –

+0

Robię Scalę przez około 9 miesięcy i naprawdę uważam, że jest niesamowita, ale to zarówno błogosławieństwo, jak i przekleństwo, że możesz robić rzeczy dokładnie tak, jak chcesz to zrobić. Oddałbym refrakcję z tego kodu. Cóż, dziękuję za wyjaśnienia i kodowanie GLHF Scala! –

Odpowiedz

12

odpowiedź Lee jest dobry, ale myślę, że odpowiada to zamiarem nieco bardziej wyraźnie:

Option(myList).filter(_.nonEmpty).map(Bar) 
6
myList.headOption.map(_ => Bar(myList)) 
+1

Ta siła jest silna. –

+0

@CoryKlein - Nie jestem pewien, czy jest to rzeczywiście lepsze niż dopasowanie jawne, ponieważ ignorowanie wartości jest nieco chaotyczne. – Lee

+1

Ale sama zwięzłość tego! –

3
import scalaz._; import Scalaz._ 
myList.toNel.map(Bar) 

toNel - jest "non-pustą listę" tutaj, zwraca Option[NonEmptyList] dla bezpieczeństwa:

scala> case class Bar(a: NonEmptyList[Int]) 
defined class Bar 

scala> List(1,2,3).toNel.map(Bar) 
res64: Option[Bar] = Some(Bar(NonEmptyList(1, 2, 3))) 

scala> List[Int]().toNel.map(Bar) 
res65: Option[Bar] = None 
2

Jak o:

Some(myList) collect { case([email protected]::tl) => Bar(l) } 

wydaje się dość scala-esque Dla mnie.

+0

Można również użyć opcji 'case l if l.nonEmpty'. –

Powiązane problemy