59 votes

Trouver un élément qui correspond au prédicat dans Scala

J'essaie de rechercher dans une collection scala un élément d'une liste qui correspond à un prédicat. Je n'ai pas nécessairement besoin de la valeur de retour, je teste simplement si la liste la contient.

En Java, je pourrais faire quelque chose comme :

 for ( Object item : collection ) {
    if ( condition1(item) && condition2(item) ) {
       return true;
    }
}
return false;

Dans Groovy, je peux faire quelque chose comme :

 return collection.find { condition1(it) && condition2(it) } != null

Quelle est la manière idiomatique de le faire dans Scala ? Je pourrais bien sûr convertir le style de boucle Java en Scala, mais j'ai l'impression qu'il existe un moyen plus fonctionnel de le faire.

63voto

om-nom-nom Points 33691

Utiliser le filtre :

 scala> val collection = List(1,2,3,4,5)
collection: List[Int] = List(1, 2, 3, 4, 5)

// take only that values that both are even and greater than 3 
scala> collection.filter(x => (x % 2 == 0) && (x > 3))
res1: List[Int] = List(4)

// you can return this in order to check that there such values
scala> res1.isEmpty
res2: Boolean = false

// now query for elements that definitely not in collection
scala> collection.filter(x => (x % 2 == 0) && (x > 5))
res3: List[Int] = List()

scala> res3.isEmpty
res4: Boolean = true

Mais si tout ce dont vous avez besoin est de vérifier, utilisez exists :

 scala> collection.exists( x => x % 2 == 0 )
res6: Boolean = true

1voto

La méthode scala serait d'utiliser exists :

 collection.exists(item => condition1(item) && condition2(item))

Et depuis java 8 vous pouvez utiliser anyMatch :

 collection.stream().anyMatch(item -> condition1(item) && condition2(item));

ce qui est bien mieux qu'une plaine for ou foreach.

0voto

Yuva Yuvi Points 58

Filtrer et exister des mots-clés pour obtenir les valeurs correspondantes des listes

 val values = List(1,2,3,4,5,6,7,8,9,10,....,1000) //List -1
val factors= List(5,7) // List -2

//To get the factors of List-2 from List-1
values .filter(a => factors.exists(b => a%b == 0)) //Apply different logic for our convenience

Le code donné permet d'obtenir les valeurs correspondantes à partir de 2 listes différentes

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X