2012-06-20 25 views
36

Tôi muốn lọc bộ dữ liệu của mình trên hai điều kiện cùng một lúc.Bộ lọc Scala trên hai điều kiện

Có thể không?

Tôi muốn một cái gì đó như thế này:

mystuff = mystuff.filter(_.isX && _.name == "xyz") 

Trả lời

58

Sử dụng cú pháp lambda hơi ít ngắn gọn:

mystuff = mystuff.filter(x => (x.isX && x.name == "xyz")) 

Bạn có thể tìm chi tiết hơn về Scala chức năng ẩn danh cú pháp here.

+1

điều này có giúp loại bỏ chi phí hoạt động không? Tôi có nghĩa là trong các truy vấn cuối cùng này được thể hiện một cách chính xác? – zinking

4

Trong khi có thể có một số tác động hiệu suất phụ thuộc vào những gì "MyStuff" là, bạn luôn có thể lọc hai lần

mystuff = mystuff.filter(_.isX).filter(_.name == "xyz") 
+0

Điều này làm tăng gấp đôi vòng lặp toàn bộ danh sách. – squixy

+5

@squixy chỉ là một FYI, nó không. 'filter' tạo ra một phép chiếu mới (hoặc xem) của bộ sưu tập sao cho khi một phần tử được yêu cầu trong khi lặp lại (tức là' map', 'fold', vv ...), các hàm' filter' được áp dụng cho xem liệu phần tử có được trả về hay không – ThaDon

4

Nếu bạn cần phải thường xuyên lọc với một số vị ngữ, bạn có thể xác định một cách để kết hợp chúng:

case class And[A](p1: A=>Boolean, p2: A=>Boolean) extends (A=>Boolean) { 
    def apply(a: A) = p1(a) && p2(a) 
} 

Dưới đây là làm thế nào để sử dụng nó để giữ chỉ số lẻ lớn hơn 10:

scala> (0 until 20) filter And(_ > 10, _ % 2 == 1) 
res3: scala.collection.immutable.IndexedSeq[Int] = Vector(11, 13, 15, 17, 19) 

Nó dễ dàng để viết OrNot combinators trong cùng một thời trang.

Các vấn đề liên quan