2013-04-30 71 views
0

在以下代碼中的過濾器代碼被提取到本地VAL:如何使用過濾器的功能的方法參數

val filterFunc = (x:VO) => x.getVal().equalsIgnoreCase("45") 

我然後可以通過這個成濾波器函數,如下所示:

.filter(filterFunc) 

但如果.filter函數是一個方法內過濾器的方法之外定義我需要的是這樣的:

def myMethod(p: A => Boolean) = { 

    .filter(p) 

    } 

p: A => Boolean.filter方法的方法簽名的一部分。上面的代碼不會編譯,因爲沒有設置類型A.如何更新代碼,使方法myMethod接受過濾器定義作爲其參數之一,然後在.filter方法內運行此代碼?

編輯:

當我做出改變:

def myMethod[A](p: A => Boolean) = { 
.filter(p) 
} 

我收到線.filter(p)錯誤:

的錯誤是:

type mismatch; found : A => Boolean required: VO => Boolean 
+0

如果您知道正在運行過濾的集合的類型,爲什麼不將p type定義爲'SomeKnownType => Boolean'? – 2013-04-30 14:54:01

+0

@ om-nom-nom是的,如果添加您的評論回答不適用 – 2013-04-30 15:23:06

+0

如果您需要更通用的解決方案,您可以添加泛型類型到您的方法簽名'def myMethod [A](p:A => Boolean) ' – parsons 2013-04-30 17:54:39

回答

0

高清myMethod的[A ](p:A =>布爾值)

+0

,但要將函數傳遞給過濾器方法,需要A的類型,因爲我將根據VO.getData的返回值進行過濾。這意味着我需要將A投到VO? – 2013-05-01 19:18:32

+1

No. p是一個接受'A'並返回布爾值的函數。 A是一個參數化類型,這意味着'A'並不存在。你可以這樣說,因爲'A'在參數列表前面的方括號內。 'A'會成爲你需要的任何東西。所以,如果你傳遞一個帶有VO的函數並返回一個布爾值,它就會起作用。 https://www.google.com/search?q=parameterized+types+scala – mbarlocker 2013-05-01 19:34:18

+0

你可以檢查我的問題更新爲斯卡拉編譯似乎不允許這? – 2013-05-02 12:38:25

0

正如評論中所說:如果您知道您正在運行過濾的集合類型,爲什麼不將p類型定義爲SomeKnownType => Boolean

+0

您是否可以檢查我的問題更新爲Scala編譯似乎不允許這樣做? – 2013-05-02 12:38:54