看板 java 關於我們 聯絡資訊
大家好 標題可能下得不太好,這是在使用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