Scala memeriksa apakah elemen ada dalam daftar

87

Saya perlu memeriksa apakah ada string dalam daftar, dan memanggil fungsi yang menerima boolean yang sesuai.

Apakah mungkin untuk mencapai ini dengan satu liner?

Kode di bawah ini adalah yang terbaik yang bisa saya dapatkan:

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

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

Saya yakin hal ini dapat dilakukan dengan sedikit pengkodean, tetapi saya tidak tahu caranya!

Dario Oddenino
sumber

Jawaban:

124

Gunakan saja contains

myFunction(strings.contains(myString))
Kim Stebel
sumber
3
Bagaimana jika saya tidak berurusan dengan string tetapi saya perlu memeriksa apakah suatu nilai adalah salah satu dari sejumlah kemungkinan kecocokan?
tutuca
2
@tutuca, periksa check-if-values-in-list-is-part-of-string ini .
Om Prakash
33

Dan jika Anda tidak ingin menggunakan persamaan yang tegas, Anda dapat menggunakan keberadaan:


myFunction(strings.exists { x => customPredicate(x) })
Matt Hughes
sumber
14

Lebih mudah!

strings contains myString
Taylrl
sumber
4
Apa bedanya dengan jawaban yang diterima ?
Alper t. Turker
2
Ini pada dasarnya sama tetapi perbedaannya adalah: 1. Lebih sedikit tanda kurung 2. Lebih sedikit titik 3. Tidak ada referensi ke myFunction 4. lebih banyak ruang kosong. Secara keseluruhan; Jawaban saya = 25 karakter vs Jawaban yang Diterima = 38 karakter
Taylrl
Itu adalah pertanyaan retorika;) Untuk memberi Anda konteks yang saya dapatkan di sini dari LQP . Saya tidak merekomendasikan penghapusan, tetapi jika Anda memposting jawaban yang terlambat, coba berikan nilai tambahan. Sedikit gula sintaksis rasanya tidak seperti itu, lho. Hanya mengatakan ...
Alper t. Turker
3
Tidak ada masalah. Saya mengerti. Saya pikir itu menambah nilai dengan menunjukkan peningkatan kesederhanaan. Terima kasih :)
Taylrl
3

Ini harus bekerja juga dengan predikat yang berbeda

myFunction(strings.find( _ == mystring ).isDefined)
DanieleDM
sumber
3
Anda bisa menggunakan existing saja daripada harus menggunakan find yang dikombinasikan dengan isDefined
Ciaran0
2

Dalam kasus Anda, saya akan mempertimbangkan untuk menggunakan Set dan bukan Daftar, untuk memastikan Anda hanya memiliki nilai unik. kecuali Anda terkadang perlu menyertakan duplikat.

Dalam kasus ini, Anda tidak perlu menambahkan fungsi pembungkus di sekitar daftar.

guykaplan
sumber
-3

Anda juga dapat mengimplementasikan containsmetode dengan foldLeft, itu cukup mengagumkan. Saya suka algoritma foldLeft.

Sebagai contoh:

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)
  }
}
Johnny
sumber