Scala controlla se l'elemento è presente in una lista


87

Devo controllare se una stringa è presente in un elenco e chiamare una funzione che accetta un booleano di conseguenza.

È possibile ottenere questo risultato con un rivestimento?

Il codice seguente è il migliore che potrei ottenere:

val strings = List("a", "b", "c")
val myString = "a"

strings.find(x=>x == myString) match {
  case Some(_) => myFunction(true)
  case None => myFunction(false)
}

Sono sicuro che sia possibile farlo con meno codice, ma non so come!

Risposte:



33

E se non volessi usare la rigorosa uguaglianza, potresti usare esistente:


myFunction(strings.exists { x => customPredicate(x) })

14

Ancora più facile!

strings contains myString

4
In che modo è diverso dalla risposta accettata ?
Alper t. Turker

2
Fondamentalmente è lo stesso ma le differenze sono: 1. Meno parentesi 2. Meno periodi 3. Nessun riferimento a myFunction 4. Più spazio bianco. Complessivamente; La mia risposta = 25 caratteri vs la risposta accettata = 38 caratteri
Taylrl

Era una domanda retorica;) Per darti un contesto ho ottenuto qui da LQP . Non ho consigliato l'eliminazione, ma se pubblichi una risposta in ritardo prova a fornire un valore aggiuntivo. Un po 'di zucchero sintattico non ne ha voglia, sai. Sto solo dicendo ...
Alper t. Turker

3
Nessun problema. Capisco. Penso che aggiunga valore mostrando una maggiore semplicità. Grazie comunque :)
Taylrl

3

questo dovrebbe funzionare anche con predicati diversi

myFunction(strings.find( _ == mystring ).isDefined)

3
Potresti semplicemente usare exist invece di dover usare find combinato con isDefined
Ciaran0

2

Nel tuo caso, prenderei in considerazione l'utilizzo di Set e non List, per assicurarti di avere solo valori univoci. a meno che non sia necessario includere talvolta duplicati.

In questo caso, non è necessario aggiungere alcuna funzione wrapper attorno agli elenchi.


-3

Puoi anche implementare un containsmetodo con foldLeft, è davvero fantastico. Adoro gli algoritmi foldLeft.

Per esempio:

object ContainsWithFoldLeft extends App {

  val list = (0 to 10).toList
  println(contains(list, 10)) //true
  println(contains(list, 11)) //false

  def contains[A](list: List[A], item: A): Boolean = {
    list.foldLeft(false)((r, c) => c.equals(item) || r)
  }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.