Scala kiểm tra xem phần tử có trong danh sách hay không


86

Tôi cần kiểm tra xem một chuỗi có trong danh sách hay không và gọi một hàm chấp nhận boolean tương ứng.

Có thể đạt được điều này với một lớp lót không?

Đoạn mã dưới đây là mã tốt nhất tôi có thể nhận được:

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

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

Tôi chắc rằng có thể làm điều này với ít mã hóa hơn, nhưng tôi không biết làm thế nào!

Câu trả lời:



32

Và nếu bạn không muốn sử dụng bình đẳng nghiêm ngặt, bạn có thể sử dụng phương thức tồn tại:


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

14

Thậm chí dễ dàng hơn!

strings contains myString

4
Điều đó khác với câu trả lời được chấp nhận như thế nào?
Alper t. Turker

2
Về cơ bản nó giống nhau nhưng khác biệt là: 1. Ít dấu ngoặc hơn 2. Ít dấu chấm hơn 3. Không tham chiếu đến myFunction 4. nhiều khoảng trắng hơn. Nhìn chung; Câu trả lời của tôi = 25 ký tự so với câu trả lời được chấp nhận = 38 ký tự
Taylrl

Đó là một câu hỏi tu từ;) Để cung cấp cho bạn bối cảnh, tôi đến đây từ LQP . Tôi không khuyên bạn nên xóa, nhưng nếu bạn đăng câu trả lời muộn, hãy thử cung cấp một số giá trị bổ sung. Một chút đường cú pháp nó không giống như nó, bạn biết đấy. Chỉ nói ...
Alper t. Turker

3
Không vấn đề gì. Tôi hiểu. Tôi nghĩ rằng nó làm tăng giá trị bằng cách thể hiện sự đơn giản hơn. Dù sao cũng cảm ơn :)
Taylrl

3

điều này cũng sẽ hoạt động với các vị từ khác

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

3
Bạn chỉ có thể sử dụng tồn tại thay vì phải sử dụng tìm kết hợp với isDefined
Ciaran0

2

Trong trường hợp của bạn, tôi sẽ cân nhắc sử dụng Đặt chứ không phải Danh sách, để đảm bảo bạn chỉ có các giá trị duy nhất. trừ khi bạn cần đôi khi bao gồm các bản sao.

Trong trường hợp này, bạn không cần thêm bất kỳ hàm trình bao bọc nào xung quanh danh sách.


-3

Bạn cũng có thể triển khai một containsphương pháp vớifoldLeft , nó khá tuyệt vời. Tôi chỉ thích thuật toán foldLeft.

Ví dụ:

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)
  }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.