it-swarm.com.de

Artikel finden, der dem Prädikat in Scala entspricht

Ich versuche, eine Scala-Sammlung nach einem Element in einer Liste zu durchsuchen, das einem Prädikat entspricht. Ich brauche nicht unbedingt den Rückgabewert, sondern teste nur, ob die Liste ihn enthält.

In Java könnte ich so etwas tun:

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

In Groovy kann ich so etwas machen:

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

Was ist der idiomatische Weg, dies in Scala zu tun? Ich könnte natürlich den Java-Loop-Stil in Scala konvertieren, aber ich denke, es gibt einen funktionaleren Weg, dies zu tun.

43
Jeff Storey

Filter verwenden: 

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

Wenn Sie jedoch nur prüfen möchten, verwenden Sie exists:

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

Testen, ob ein Prädikat für den Abgleich von Werten vorhanden ist

Wenn Sie nur daran interessiert sind, zu testen, ob ein Wert existiert, können Sie dies mit ... exists tun.

scala> val l=(1 to 4) toList
l: List[Int] = List(1, 2, 3, 4)

scala> l exists (_>5)
res1: Boolean = false

scala> l exists (_<2)
res2: Boolean = true

scala> l exists (a => a<2 || a>5)
res3: Boolean = true

Andere Methoden (einige basieren auf Kommentaren):

Passende Elemente zählen

Elemente zählen, die dem Prädikat entsprechen (und prüfen, ob count> 0 ist)

scala> (l count (_ < 3)) > 0
res4: Boolean = true

Erstes übereinstimmendes Element zurückgeben

Finden Sie das erste Element, das dem Prädikat genügt (wie von Tomer Gabel und Luigi Plinge vorgeschlagen, dies sollte effizienter sein, da es zurückkehrt, sobald es ein Element findet, das das Prädikat erfüllt, anstatt die ganze Liste trotzdem zu durchlaufen).

scala> l find (_ < 3)
res5: Option[Int] = Some(1) 

// also see if we found some element by
// checking if the returned Option has a value in it
scala> l.find(_ < 3) isDefined
res6: Boolean = true

Prüfen, ob der genaue Wert vorhanden ist

Für den einfachen Fall, in dem wir eigentlich nur prüfen, ob ein bestimmtes Element in der Liste enthalten ist

scala> l contains 2
res7: Boolean = true
53
Paolo Falabella

Die Scala-Methode wäre die Verwendung von exists:

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

Und seit Java 8 können Sie anyMatch verwenden:

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

das ist viel besser als eine Ebene für oder foreach.

0

Filter und vorhandene Schlüsselwörter, um die übereinstimmenden Werte aus Listen zu erhalten

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

Der angegebene Code hilft dabei, die übereinstimmenden Werte aus 2 verschiedenen Listen zu erhalten

0
Yuva Yuvi