scala

Getting the element from a 1-element Scala collection


Learning Scala and I keep wanting an equivalent to LINQ's Single() method. Example,

val collection: Seq[SomeType]
val (desiredItem, theOthers) = collection.partition(MyFunc)

desiredItem.single.doSomething
         // ^^^^^^

I could use desiredItem.head but what if MyFunc actually matched several? I want the assurance that there's only one.

I am thinking if this was a common need it would be in the base API. Do properly written Scala programs need this?


Solution

  • I'd use something more verbose instead of single:

     (desiredItem match {
       case Seq(single) => single
       case _ => throw IllegalStateException("Not a single element!")
     }).doSomething
    

    Its advantage over single is that it allows you to explicitly control the behavior in exceptional case (trow an exception, return fallback value).

    Alternatively you can use destructuring assignment:

    val Seq(single) = desiredItem
    single.doSomething
    

    In this case you'll get MatchError if desiredItem doesn't contain exactly one element.

    UPD: I looked again at your code. Destructuring assignment is the way to go for you:

    val collection: Seq[SomeType]
    val (Seq(desiredItem), theOthers) = collection.partition(MyFunc)
    
    desiredItem.doSomething