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")
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")
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.
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")
Điều này làm tăng gấp đôi vòng lặp toàn bộ danh sách. – squixy
@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
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 Or
và Not
combinators trong cùng một thời trang.
đ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