Java8的簡介
Java8是Java釋出以來改動最大的一個版本,其中主要添加了函數語言程式設計、Stream、一些日期處理類。
函數語言程式設計中中新加了一些概念:Lambda表示式、函式式介面、函式引用、預設方法、Optional類等;Stream中提供了一些流式處理集合的方法,並提供了一些歸約、劃分等類的方法;日期中添加了ZoneDateTime、DataFormat等執行緒安全的方法類;
一:Lambda(匿名函式)介紹
1.簡介(方法作為值傳遞、純函式不改變值)
在Java8中引入了函數語言程式設計,可以簡化程式碼邏輯,並將函式作為引數來傳遞;其原理是在函式上封裝了一層,提供了一個語法糖,編譯器將lambda表示式解釋為函式式介面(除了預設方法,只有一個方法的interface),而利用介面式程式設計對資料進行操作,下面用List排序來說明老的和新的的不同點:
List<Student> students = new ArrayList<Student>(){{ add(new Student("xx",90)); add(new Student("yy",90)); add(new Student("zz",80)); }}; System.out.println("This is a old example!"); Collections.sort(students, new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { return o1.getName().compareTo(o2.getName()); } }); System.out.println("This is a lambda example!"); students.sort(Comparator.comparing((Student::getGrade)));
2.原理分析
1)default方法:List直接呼叫sort方法,是因為在List中添加了default方法,這樣可以在不影響List眾多的實現類和繼承類的前提下,對原有的List進行功能擴充
default void sort(Comparator<? super E> c) { Object[] a = this.toArray(); Arrays.sort(a, (Comparator) c); ListIterator<E> i = this.listIterator(); for (Object e : a) { i.next(); i.set((E) e); } }
2)方法引用,類名::方法,是Lambda表示式的一個縮寫,當傳入的函式正好可以直接被對應的方法使用時,使用方法引用來縮寫
3)函式式介面,在上面的例子中,Student::getGrade是一個Lambda表示式,Comparator.comparing需要的引數為Function<? super T, ? extends U> keyExtractor,這個Function就是一個函式式介面,JVM會在編譯時,將該Lambda表示式翻譯成該函式式表示式,所以說Lambda是在Function的基礎上封裝了一層。
二:Stream簡介
1.流是一系列資料項,一次只生成一項,它類似於Unix中的cat、tr等命令,是針對輸入的一行一行的流來進行處理,這樣可以將操作連貫起來,也方便系統的流水線執行;
Collection主要是為了儲存和訪問資料,而Stream則主要用於描述對資料的計算。Stream中將迭代等在內部實現,並可以根據Fork/Join根據系統的情況進行效能上的優化;
//("This is a old example!");
Map<Integer, List<Student>> stuByGrade = new HashMap<>();
for(Student stu : students){
Integer grade = stu.getGrade();
List<Student> stuForGrade = stuByGrade.get(grade);
if(stuForGrade == null){
stuForGrade = new ArrayList<>();
stuForGrade.add(stu);
}
}
//("This is a lambda example!");
Map<Integer, List<Student>> stuByGrade2 = students.stream()
.collect(groupingBy(Student::getGrade));
三:Optional類
幫助你避免出現 NullPointer異常。它是一個容器物件,可以包含,也可以不包含一個值。