2015-05-23 26 views
1

我剛開始在this Oracle website上查看流。立即看到下面的代碼的一個問題是:如果我想重用過濾器邏輯,例如有個人的方法是「isAdult」嗎?使用具有自定義功能接口的流

由於它不接受參數Person,因此這不適用於流作爲方法引用。類似地,我將無法創建一個篩選器,它接受和使用年齡創建可參數化的「isOlderThan」邏輯的附加int參數。

我找不到一種方式將流與定製的功能接口一起使用。你會如何模擬這種行爲?我覺得在上面的場景中創建一個靜態的「isAdult」方法不是一個非常乾淨的解決方案,也不是用這種方法創建一個「PersonChecker」對象。

List<Person> list = roster.parallelStream().filter((p) -> p.getAge() > 18).collect(Collectors.toList()); 

謝謝

回答

4
List<Person> list = roster.parallelStream().filter((p) -> p.getAge() > 18).collect(Collectors.toList()); 

如果我想重用過濾邏輯,例如有個人的方法是「isAdult」嗎?

List<Person> list = roster.parallelStream().filter(Person::isAdult).collect(Collectors.toList()); 

List<Person> list = roster.parallelStream().filter(p -> p.isAdult()).collect(Collectors.toList()); 

我將無法建立,它接受一個過濾器和額外的int參數與年齡來創建參數化「isOlderThan」的邏輯。

List<Person> list = roster.parallelStream().filter(p -> p.isOlderThan(18)).collect(Collectors.toList()); 

我看不出有什麼自定義功能接口與你的問題做。 Predicate是您需要的唯一函數接口,而lambda和方法引用是創建Predicate實例的極其簡單的方法。

+0

謝謝,併爲這個微不足道的問題道歉,它來自方法引用(我嘗試使用p :: isAdult)的一個不相關的誤解,加上錯誤的想法,因爲謂詞「測試」方法接受1參數,所以必須由拉姆達。 – user1578796