[問題] 關於method refrence
問題參考:https://magiclen.org/ocpjp-collection-sort/
關於下列程式碼,兩個問題想請問版上的高手們:
問題1:於下列程式碼註解line n1處,s -> s.getEAge() > 50為何無法使用method
refrence? (Emp::getEAge) > 50
問題2:於下列程式碼註解line n2處,map(Emp::getEName)為何不會編譯錯誤?
就小的理解使用method refrence時,其中之一的用法ClassName::StaticMethod
,故getEName應該必須為static method?
先謝謝版上高手回覆!
class Emp {
private String eName;
private int eAge;
Emp(String eN, Integer eA) {
this.eName = eN;
this.eAge = eA;
}
public int getEAge() {
return eAge;
}
public String getEName() {
return eName;
}
}
public class Test809 {
public static void main(String[] args) {
List<Emp> li = Arrays.asList(new Emp("Sam", 20), new Emp("John", 60),
new Emp("Jim", 51));
Predicate<Emp> agVal = s -> s.getEAge() > 50; //line n1
li = li.stream().filter(agVal).collect(Collectors.toList());
Stream<String> names = li.stream().map(Emp::getEName); //line n2
names.forEach(n -> System.out.print(n + " "));
}
}
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.136.49.101 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/java/M.1605621788.A.101.html
→
11/18 09:44,
4年前
, 1F
11/18 09:44, 1F
→
11/18 09:44,
4年前
, 2F
11/18 09:44, 2F
→
11/18 09:45,
4年前
, 3F
11/18 09:45, 3F
關於問題1,後來上網查到說"只有當lambda中僅執行一個方法的情況下才能改以method
refrence語法撰寫,上述例子因為後面有>50,所以此lambda無法以method refrence來表
達
→
11/18 10:31,
4年前
, 4F
11/18 10:31, 4F
關於問題2,參考下列網址說明:
https://blog.csdn.net/weixin_41126303/article/details/81187002
重點1:接口方法的参数比引用方法的参数多一个
重點2:接口方法的第一个参数恰巧是调用引用方法的对象(其引用方法所在类
或其父类的实例)
本篇文章中,Class Emp中的getEName方法有符合上述兩重點(參數數量0,引用方法所在
類別為Emp (T的一種)),因此可以用method refrence。
(Function中apply方法參數數量為1,且方法中第一個參數型態為T)
※ 編輯: HiItsMe (210.71.217.245 臺灣), 11/18/2020 10:37:33
※ 編輯: HiItsMe (210.71.217.245 臺灣), 11/18/2020 10:47:48
→
11/18 10:39,
4年前
, 5F
11/18 10:39, 5F
→
11/18 10:40,
4年前
, 6F
11/18 10:40, 6F
→
11/18 10:41,
4年前
, 7F
11/18 10:41, 7F
→
11/18 10:42,
4年前
, 8F
11/18 10:42, 8F
→
11/18 12:39,
4年前
, 9F
11/18 12:39, 9F
→
11/18 12:40,
4年前
, 10F
11/18 12:40, 10F
討論串 (同標題文章)
完整討論串 (本文為第 1 之 2 篇):
java 近期熱門文章
PTT數位生活區 即時熱門文章