不定長引數
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 ...