1. 程式人生 > >Java8的簡介

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異常。它是一個容器物件,可以包含,也可以不包含一個值。