[問題] Lambda Functional參數問題
大家好
標題可能下得不太好,這是在使用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
12/12 18:08, 1F
→
12/12 18:10,
7年前
, 2F
12/12 18:10, 2F
→
12/12 18:11,
7年前
, 3F
12/12 18:11, 3F
→
12/12 18:18,
7年前
, 4F
12/12 18:18, 4F
→
12/12 18:20,
7年前
, 5F
12/12 18:20, 5F
→
12/12 18:21,
7年前
, 6F
12/12 18:21, 6F
→
12/12 18:26,
7年前
, 7F
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
12/12 18:28, 10F
感謝解答!
類別::方法的參數似乎有點像是Python
instance method的第一個參數是物件本身
※ 編輯: kyleJ (49.217.133.103), 12/13/2017 19:56:37
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 2 篇):
java 近期熱門文章
PTT數位生活區 即時熱門文章