[Java] 17.2. lambda & 泛型

lambda也可以支援泛型。

 

image/svg+xml17.2.lambda 與泛型 - lambda & Generic 泛型,推論 lambda 參數的型別 import java.util.*; class Main{ public static void main( String [] args){ Employee e1 = new Employee ( "K12345678" , “Jack" , 20 , " 男⽣ " , "048679" , 40000 ); Employee e2 = new Employee ( "K00000000" , “Eric" , 25 , " 男⽣ " , "041121" , 45000 ); Employee e3 = new Employee ( "K11111111" , “Mary" , 18 , " 女⽣ " , "050021" , 30000 ); Employee e4 = new Employee ( "K22222222" , “Jack" , 19 , " 男⽣ " , "051212" , 42000 ); List l = new ArrayList(); l.add(e1); l.add(e2); l.add(e3); l.add(e4); Comparator nameComparator = ( Object o1, Object o2) -> { Employee emp1 = (Employee) o1; Employee emp2 = (Employee) o2; return emp1.name.compareTo(emp2.name); } Collections.sort( l , nameComparator); for ( Object o : l){ Employee e = (Employee)o; System.out.println(e.name); } } } import java.util.*; class Main{ public static void main( String [] args){ Employee e1 = new Employee ( "K12345678" , “Jack" , 20 , " 男⽣ " , "048679" , 40000 ); Employee e2 = new Employee ( "K00000000" , “Eric" , 25 , " 男⽣ " , "041121" , 45000 ); Employee e3 = new Employee ( "K11111111" , “Mary" , 18 , " 女⽣ " , "050021" , 30000 ); Employee e4 = new Employee ( "K22222222" , “Jack" , 19 , " 男⽣ " , "051212" , 42000 ); List < Employee > l = new ArrayList < Employee >(); l.add ( e1 ); l.add ( e2 ); l.add ( e3 ); l.add ( e4 ); Comparator < Employee > nameComparator1 = ( Employee emp1 , Employee emp2 ) -> { return emp1.name .compareTo( emp2.name ); }; Comparator < Employee > nameComparator2 = (emp1, emp2) -> { return emp1.name .compareTo( emp2.name ); }; for ( Object o : l){ Employee e = (Employee)o; System.out.println(e.name); } } } import java.util.*; class Main{ public static void main( String [] args){ Employee e1 = new Employee ( "K12345678" , “Jack" , 20 , " 男⽣ " , "048679" , 40000 ); Employee e2 = new Employee ( "K00000000" , “Eric" , 25 , " 男⽣ " , "041121" , 45000 ); Employee e3 = new Employee ( "K11111111" , “Mary" , 18 , " 女⽣ " , "050021" , 30000 ); Employee e4 = new Employee ( "K22222222" , “Jack" , 19 , " 男⽣ " , "051212" , 42000 ); List < Employee > l = new ArrayList < Employee >(); l.add ( e1 ); l.add ( e2 ); l.add ( e3 ); l.add ( e4 ); Collections.sort ( l , (emp1, emp2) -> { return emp1.name.compareTo(emp2.name) } ); Collections.sort ( l , (emp1, emp2) -> emp1.name.compareTo(emp2.name) ); for ( Object o : l){ Employee e = (Employee)o; System.out.println(e.name); } } } J17_2_1 Main.java 3. 還有更簡化的⽅法讓程式在少寫⼀點嗎 ? J17_2_2 Main.java 1. 使⽤ lambda 建立匿名類別時,其函式還是要與 Comparator 介⾯的 compare() ⽅法⼀致,如參數需明確寫下型別 Object 2. 過程中也需要使⽤強迫轉型轉換為員⼯物件。 1. 在此使⽤泛型的 List ,指定放入的物件為員⼯ Employee 型別的物件。 2. 還記得 Comparator 有個泛型的 Comparator 嘛,透過雙箭頭 (<>) 指定泛型為 Employee 4. 因為泛型以指定為 Employee lambda 的參數的型別也可以省略, 因為編譯器透過變數的泛型得知這兩個參數都是 Employee 型別。 3. 這樣實作的 compare() ⽅法就被指定為 Employee 了,就少 了轉型成員⼯的程式,直接存在員⼯上的姓名 name 屬性。還有 更簡化的⽅法讓程式在少寫⼀點嗎 ? 5. 這時取得的物件已是員⼯物件所以不⽤在轉型了,直接 使⽤名字屬性進⾏⼤⼩的比較,簡化了轉型的程式。 lambda 實作的⽅法其回傳值也是⼀個泛型,其型別也是可以透過推論的⽅ 式取得。另⼀個簡化是當參數只有⼀個時,其⼩括號 (()) 還可以省略,⾄若 沒參數,還是要有⼩括號,因此建立都使⽤⼩括號 (()) 的好。 J17_2_3 Main.java 1. 在此使⽤泛型的 List ,指定放入的物件為員⼯ Employee 型別的物件。 2. 甚⾄可以透過 sort() ⽅法,從 l 變數中的 List<Employee> 取得泛型 Employee ,然後推論出後⾯的 lambda 的泛型型別為 Employee 3. 記住,這⼀切都是因為泛型發⽣作⽤,透過編譯器的推論,得知 lambda 參數。 4. 另⼀個簡化是都程式只有⼀⾏時,⼤括號 ({}) return 甚⾄都可以不⽤寫,編 譯器會⾃動為這⼀⾏加上加上⼤括號 ({}) return 。如此就⼤⼤的簡化程式的撰 寫,寫起來就像在寫⼀個運算式⼀般簡單,⽽這就是 lambda 的威⼒。 即便使⽤ lambda 這個函式還是有點長,可以在簡化嗎 ? 更多的簡化

留言