2015年5月6日 星期三

JavaSE8 Lambda 起手勢-簡單筆記


前言 

好像JDK9都快出來了現在才寫JDK8 orz
好吧其實也是之前寫的筆記一直沒放上來


正文
 
JDK8之前,如果你想排序,你可能會這麼做

String[] names = {"C333","A1","B22"};
Arrays.sort(names, new Comparator<String>() {
     public int compare(String name1, String name2) {
         return name1.length() - name2.length();
     }
});

for(String name:names) System.out.println(name);

Or

String[] names = {"C333","A1","B22"};
Comparator<String> comparator = new Comparator<String>() {
     @Override
     public int compare(String name1, String name2) {
         return name1.length() - name2.length();
     }
};

Arrays.sort(names,comparator);
for(String name:names) System.out.println(name);

這真的又臭又長對吧?
那麼讓我們看看Lambda

Comparator<String> comparator =(String name1,String name2)->name1.length()-name2.length();

Or

Comparator<String> comparator =(name1,name2)->name1.length()-name2.length();

所以你可以這麼更改它

String[] names = {"C333","A1","B22"};
Arrays.sort(names,(name1,name2)->name1.length()-name2.length());
for(String name:names) System.out.println(name);

恭喜!你學會使用它了
不過還有一件事
當你學到一些新東西時
你會無時無刻都使用它
因此你的程式可能充滿著滿滿的Lambda

來看看這個情境吧
public class comparator {
public int compare(String s1, String s2) {
         return s1.length() - s2.length();
}
}

public class main {
public static void main(String[] args) {
         String[] names = {"C333","A1","B22"};
         comparator c = new comparator();
         Arrays.sort(names,(name1,name2)->c.compare(name1,name2));
         for(String name:names) System.out.println(name);
}
}

這麼做很好的,但我們可以讓它更好

方法參照,這是配合Lambda新推出的功能
語法:class::method
所以我們可以這麼改

Arrays.sort(names,c::compare);
for(String name:names) System.out.println(name); 

補個重點: Lambda的語法Input -> body