Tôi có một mã như:scala, lọc một bộ sưu tập dựa trên một số điều kiện
val strs = List("hello", "andorra", "trab", "world")
def f1(s: String) = !s.startsWith("a")
def f2(s: String) = !s.endsWith("b")
val result = strs.filter(f1).filter(f2)
bây giờ, f1 và f2 nên được áp dụng dựa trên một điều kiện, chẳng hạn như:
val tmp1 = if (cond1) strs.filter(f1) else strs
val out = if (cond2) tmp1.filter(f2) else tmp1
là có cách nào tốt hơn để làm điều này, mà không sử dụng biến tạm thời tmp1
?
một cách sẽ để lọc dựa trên một danh sách các chức năng, chẳng hạn như:
val fs = List(f1 _,f2 _)
fs.foldLeft(strs)((fn, list) => list.filter(fn))
nhưng sau đó tôi sẽ cần phải xây dựng một danh sách các chức năng dựa trên các điều kiện (và do đó, tôi sẽ chuyển vấn đề sử dụng biến danh sách chuỗi tạm thời, để sử dụng biến danh sách hàm tạm thời (hoặc tôi cần phải sử dụng danh sách có thể thay đổi)).
Tôi đang tìm kiếm một cái gì đó như thế này (tất nhiên điều này không biên dịch, nếu không tôi sẽ đã có câu trả lời cho các câu hỏi):
val result =
strs
.if(cond1, filter(f1))
.if(cond2, filter(f2))
Có vẻ như bạn muốn danh sách các bộ dữ liệu có (condition, filterPredicate). Sau đó, bạn có thể lọc danh sách này dựa trên điều kiện có hay không (ví dụ: _._ 1) giữ. Bây giờ bạn có một danh sách các hàm bạn muốn áp dụng. Sau đó, bạn có thể ánh xạ chuỗi này bằng chuỗi và giảm bằng && (logic và). Xin lỗi nếu nó quá lượn sóng. – Felix
cảm ơn, đó cũng là một ý tưởng hay, nhưng tôi đang tìm kiếm một cái gì đó giống như câu trả lời của noah. –