作者kyleJ (K)
看板java
標題[問題] Lambda Functional參數問題
時間Tue Dec 12 16:59:06 2017
大家好
標題可能下得不太好,這是在使用Optional的map時的疑問
-- 前言 --
假設我有一個User class,他有以下兩個method
String getName()
void setName(String name)
我看到一個教學的用法是這樣:
Optional.ofNullable(user).map(User::getName).orElse("NA");
效果等同:
(user!=null && user.getName()!=null)? user.getName(): "NA";
兩種寫法都能回傳user的name,並且有預設值 NA
但要呼叫好幾層getter的時候可以用map串起來
寫起來比較簡潔,語意也比較清楚
-- 問題 --
疑問的點是看了map的參數是 Functional<User, ? extends U>
要實作的method是 U apply(User user)
這跟 String getName() 對不起來
後來自己測試寫了
Functional<User, String> func=User::getName;
func.apply(user);
這樣編譯能過,也可以正確的拿到user name的值
若改成 Functional<Object, String> func=... 就會error
這看起來像是使用反射呼叫 User.class.getMethod("getName")
然後再呼叫 method.invoke(user)
這樣就能跟 Functional 的 U apply(User user) 一樣參數與回傳值了
想請問
getName是non-static的method,為什麼可以寫成User::getName?
User::getName 為何可以指定給 Functional<User, String> func?
是不是在這種情況下會自動變成Method的反射?
我在Lambda的教學中沒看到這種情況,有什麼文章或關鍵字可以查詢嗎?
感謝各位
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 49.217.133.103
※ 文章網址: https://www.ptt.cc/bbs/java/M.1513069153.A.1CF.html
→ ssccg: FunctionalInterface是只是定義method要長怎樣12/12 18:08
→ ssccg: User::getName是個String(User) = Functional<User,String>12/12 18:10
→ ssccg: non-static method只是相當於第一個參數代入this12/12 18:11
→ ssccg: 如果你是要問實作,Lambda expression是在執行時動態產生一12/12 18:18
→ ssccg: 個物件,繼承需要的Functional Interface,實作直接呼叫要12/12 18:20
→ ssccg: 呼叫的方法,每次呼叫就透過這個物件,效能比Reflection好12/12 18:21
→ ssccg: 補充一下instance(non-static)有兩種,一種是特定物件寫成12/12 18:26
→ ssccg: 變數::方法,那參數就是原本方法的參數。一種是類別::方法12/12 18:27
→ ssccg: 參數多一個,第一個就是類別,剩下是原本方法的參數12/12 18:28
→ ssccg: 前者固定是用那個物件,後者就會變成類似static method12/12 18:28
感謝解答!
類別::方法的參數似乎有點像是Python
instance method的第一個參數是物件本身
※ 編輯: kyleJ (49.217.133.103), 12/13/2017 19:56:37