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!

Jawaban:



33

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


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

14

Lebih mudah!

strings contains myString


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)

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.


-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)
  }
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.