[問題] 關於method refrence

看板java作者 (Hello)時間4年前 (2020/11/17 22:03), 4年前編輯推噓0(0010)
留言10則, 1人參與, 4年前最新討論串1/2 (看更多)
問題參考: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
1.完整來說那段是 (Emp s) -> { s.getEAge() > 50; }
11/18 09:44, 1F

11/18 09:44, 4年前 , 2F
*漏了 return
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
2.ClassName::Method沒有一定要static,非static的話解析出
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
的Function會多一個ClassName參數
11/18 10:39, 5F

11/18 10:40, 4年前 , 6F
Emp::getName的type相當於Function<Emp,String>
11/18 10:40, 6F

11/18 10:41, 4年前 , 7F
另外第一個其實不是不能用method reference,是不能像你問
11/18 10:41, 7F

11/18 10:42, 4年前 , 8F
的這樣組合
11/18 10:42, 8F

11/18 12:39, 4年前 , 9F
method reference expression不是lambda expression
11/18 12:39, 9F

11/18 12:40, 4年前 , 10F
只是兩種都會解析成functional interface的instance
11/18 12:40, 10F
文章代碼(AID): #1VizWS41 (java)
文章代碼(AID): #1VizWS41 (java)