同時使用多個篩選器來過濾資料

2021-09-20 04:50:04 字數 2614 閱讀 2108

不定長引數

val arr = list(111,222,333,444,555)

def sum(args:int*):int = args.foldleft(0)((sum,v)=>sum+v) // 就是args.sum求和

sum(arr:_*) // res0: int = 1665

不定長引數的定義(args:int*)表示args是乙個seq[int]序列,當呼叫sum函式時候傳遞arr引數。

篩選器

判斷在arr中是否有》300的值。

def any(args:int*):boolean = args.exists(pred=>pred>300)

any(arr:_*) // true

傳遞不定數量的函式

傳遞不定數量的函式做為any的引數,仿照上面傳遞多個int*的寫法,假設傳遞的函式的型別是(int=>boolean),意思是引數是int,返回值是boolean,那麼傳遞多個函式的寫法如下。

def any(args:(int=>boolean)*):boolean = args.exists(pred=>pred(300))

要知道args是乙個seq序列,那麼any是呼叫的seq的exists方法,因為args每個元素此時都是乙個(int=>boolean)型別的函式,那麼pred=>pred(300)的意思是說呼叫每個函式並將300做為引數,pred就是args中的元素哦。整個定義是判斷所有args中的函式在代入300後,是否有返回true的,如果有則any就返回true,否則any返回false。測試一下:

def f1:(int=>boolean) = one_int => one_int > 300 // 300>300

def f2:(int=>boolean) = one_int => one_int < 200 // 300<200

any(f1,f2) // false

顯然,上面f1和f2在傳入300後都返回false,那麼any就返回false。那麼如何把pred=>pred(300)中的300變成可自定義的值呢,如下。

返回乙個(int=>boolean)型別的函式

讓any返回乙個(int=>boolean)型別的函式,這將消除300的問題。

def any(args:(int=>boolean)*):(int=>boolean) = one_int => args.exists(pred=>pred(one_int))

現在any會返回乙個引數型別是int的函式。繼續使用上面定義的f1和f2的定義,測試一下:

val f3 = any(f1,f2) // 篩選出》300或<200的數

f3(300) // false

f3(400) // true

f3(100) // true

any的問題解決了,但是f1和f2中的固定值也要消除的哦。同樣的套路:

def f1:(int=>(int=>boolean)) =

one_int=>

item=>item>one_int

def f2:(int=>(int=>boolean)) =

one_int=>

item=>item函式f1和f2都返回型別為(int=>(int=>boolean))的函式。測試一下:

val f3 = f1(400) // >400的數

val f4 = f2(300) // <300的數

val f5 = any(f3,f4) // 篩選》400或者<300的數

f5(222) // true

f5(333) // false

f5(444) // true

使用type定義型別

上面的(int=>(int=>boolean))定義確實夠長的,那麼多括號看著眼花,使用type來簡化一下:

type intfilter = int=>boolean

def f1:(int=>intfilter) =

one_int=>

item=>item>one_int

再看any的定義

上面得到any的定義為:

def any(args:(int=>boolean)*):(int=>boolean) = one_int => args.exists(pred=>pred(one_int))

可以發現這個函式只能用於(int=>boolean)的型別,擺脫int型別的限制是需要解決的。使用泛型:

def anya*):(a=>boolean) = one_a => args.exists(pred=>pred(one_a))

1此處的[a]表示型別,在使用上並沒有什麼不同,完全可以用上面的例子測試。

是時候展示乙個小例子了

借用上面f1到f5的定義,篩選arr中所有》400或<300的元素。

val arr = list(111,222,333,444,555)

arr.filter(f5)

啊啊啊,這完全可以用

arr.filter(_>400 || _<300)

新老阿里雲賬戶均可領取!可用於購買阿里雲伺服器ecs、雲資料庫rds、虛擬主機、安騎士、ddos高防ip等100多雲計算產品。 代金券自領取之日起,有效期是30天,請及時使用,過30天後還可以重新領取。

資料篩選器過濾器配置過程

開啟資料庫裡面的 資料篩選器按鈕 複製裡面的兩個 這一步就結束了 準備view 到系統裡快速建立鏈結表 修改子窗體的名字為sfrlist 複製按鈕和複製裡面的 篩選和重新整理 到list窗體裡面去將資料來源更新掉,設定好初始化條件,並複製出來所需要的篩選語句.拼接好兩個語句,sourcerecord...

你是否也同時使用多個瀏覽器?

我經常被問到我使用哪些瀏覽器,我的回答是我會全部使用它們。雖然聽起來有點誇張,但確實是這樣。我整天都在使用多個瀏覽器。我曾用個人配置的火狐瀏覽器中執行所有操作,但是後來轉向使用多個瀏覽器。這裡是我的設定 我的系統上有火狐瀏覽器穩定版,nightly,歐朋瀏覽器,vivaldi,谷歌瀏覽器穩定版和ca...

Swift 使用閉包篩選過濾資料元素

通常篩選乙個陣列,通常會在 的其它地方建立乙個函式,然後為陣列的每個元素呼叫它。但這樣做會使 分散在許多地方,不便於閱讀。使用閉包就可以將相關 片斷放在一起,使結構邏輯更加清晰。比如,篩選乙個字元陣列,過濾出以 hangge 開頭的字串陣列 12 3 4 5 letarray hangge com ...