作者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://webptt.com/cn.aspx?n=bbs/java/M.1513069153.A.1CF.html
1F:→ ssccg: FunctionalInterface是只是定义method要长怎样12/12 18:08
2F:→ ssccg: User::getName是个String(User) = Functional<User,String>12/12 18:10
3F:→ ssccg: non-static method只是相当於第一个参数代入this12/12 18:11
4F:→ ssccg: 如果你是要问实作,Lambda expression是在执行时动态产生一12/12 18:18
5F:→ ssccg: 个物件,继承需要的Functional Interface,实作直接呼叫要12/12 18:20
6F:→ ssccg: 呼叫的方法,每次呼叫就透过这个物件,效能比Reflection好12/12 18:21
7F:→ ssccg: 补充一下instance(non-static)有两种,一种是特定物件写成12/12 18:26
8F:→ ssccg: 变数::方法,那参数就是原本方法的参数。一种是类别::方法12/12 18:27
9F:→ ssccg: 参数多一个,第一个就是类别,剩下是原本方法的参数12/12 18:28
10F:→ ssccg: 前者固定是用那个物件,後者就会变成类似static method12/12 18:28
感谢解答!
类别::方法的参数似乎有点像是Python
instance method的第一个参数是物件本身
※ 编辑: kyleJ (49.217.133.103), 12/13/2017 19:56:37