[問題] Lambda Functional參數問題

看板java作者 (K)時間7年前 (2017/12/12 16:59), 7年前編輯推噓0(0010)
留言10則, 1人參與, 7年前最新討論串1/2 (看更多)
大家好 標題可能下得不太好,這是在使用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

12/12 18:08, 7年前 , 1F
FunctionalInterface是只是定義method要長怎樣
12/12 18:08, 1F

12/12 18:10, 7年前 , 2F
User::getName是個String(User) = Functional<User,String>
12/12 18:10, 2F

12/12 18:11, 7年前 , 3F
non-static method只是相當於第一個參數代入this
12/12 18:11, 3F

12/12 18:18, 7年前 , 4F
如果你是要問實作,Lambda expression是在執行時動態產生一
12/12 18:18, 4F

12/12 18:20, 7年前 , 5F
個物件,繼承需要的Functional Interface,實作直接呼叫要
12/12 18:20, 5F

12/12 18:21, 7年前 , 6F
呼叫的方法,每次呼叫就透過這個物件,效能比Reflection好
12/12 18:21, 6F

12/12 18:26, 7年前 , 7F
補充一下instance(non-static)有兩種,一種是特定物件寫成
12/12 18:26, 7F

12/12 18:27, 7年前 , 8F
變數::方法,那參數就是原本方法的參數。一種是類別::方法
12/12 18:27, 8F

12/12 18:28, 7年前 , 9F
參數多一個,第一個就是類別,剩下是原本方法的參數
12/12 18:28, 9F

12/12 18:28, 7年前 , 10F
前者固定是用那個物件,後者就會變成類似static method
12/12 18:28, 10F
感謝解答! 類別::方法的參數似乎有點像是Python instance method的第一個參數是物件本身 ※ 編輯: kyleJ (49.217.133.103), 12/13/2017 19:56:37
文章代碼(AID): #1QBvfX7F (java)
文章代碼(AID): #1QBvfX7F (java)