首頁>Club>
4
回覆列表
  • 1 # 千鋒頭號粉絲

    隨著程式語言生態系統的氣候不斷變化以及技術的革新,經歷20餘年的發展,Java逐漸演變成長為Java8。相比之前只是單純的面向物件程式語言,Java8增加了很多新特性。

    Java 8對於程式設計師的主要好處在於它提供了更多的程式設計工具和概念,能以更為簡潔、更易於維護的方式解決新的或現有的程式設計問題。在Java 8中有兩個著名的改進:一個是Lambda表示式,一個是Stream。

    Lambda表示式是什麼?

    Lambda表示式,也可稱為閉包,它允許把函式作為一個方法的引數(函式作為引數傳遞進方法中)。使用Lambda表示式可以使程式碼變的更加簡潔緊湊,Lambda表示式的語法格式:

    (parameters) -> expression或(parameters) ->{ statements; }

    Lambda表示式的重要特徵:

    可選型別宣告:不需要宣告引數型別,編譯器可以統一識別引數值。

    可選的引數圓括號:一個引數無需定義圓括號,但多個引數需要定義圓括號。

    可選的大括號:如果主體包含了一個語句,就不需要使用大括號。

    可選的返回關鍵字:如果主體只有一個表示式返回值則編譯器會自動返回值,大括號需要指定明表示式返回了一個數值。

    使用Lambda表示式需要注意以下兩點:

    Lambda表示式主要用來定義行內執行的方法型別介面,例如,一個簡單方法介面。在上面例子中,我們使用各種型別的Lambda表示式來定義MathOperation介面的方法。然後我們定義了sayMessage的執行。

    Lambda表示式免去了使用匿名方法的麻煩,並且給予Java簡單但是強大的函式化的程式設計能力。

    Stream是什麼?

    Stream就是一個流,它的主要作用就是對集合資料進行查詢過濾等操作。Java 8中的 Stream是對集合(Collection)物件功能的增強,它專注於對集合物件進行各種非常便利、高效的聚合操作(aggregate operation),或者大批次資料操作(bulk data operation)。

    對於基本數值型,目前有三種對應的包裝型別Stream:IntStream、LongStream、DoubleStream。當然我們也可以用Stream<Integer>、Stream<Long> >、Stream<Double>,但是boxing和 unboxing會很耗時,所以特別為這三種基本數值型提供了對應的Stream。

    Java 8中還沒有提供其它數值型Stream,因為這將導致擴增的內容較多。而常規的數值型聚合運算可以透過上面三種Stream進行。

    Stream上的操作分為兩類:中間操作和結束操作。中間操作只是一種標記,只有結束操作才會觸發實際計算。

    中間操作又可以分為無狀態的(Stateless)和有狀態的(Stateful),無狀態中間操作是指元素的處理不受前面元素的影響,而有狀態的中間操作必須等到所有元素處理之後才知道最終結果,比如排序是有狀態操作,在讀取所有元素之前並不能確定排序結果。

    結束操作又可以分為短路操作和非短路操作,短路操作是指不用處理全部元素就可以返回結果,比如找到第一個滿足條件的元素。之所以要進行如此精細的劃分,是因為底層對每一種情況的處理方式不同。

    想要永遠處於優勢地位,就要不斷的完善自身、更新技術。

  • 2 # Java架構達人

    一.介面內允許新增預設實現的方法

    在原來的定義中介面中只能有方法宣告,不能有方法體。在Java8中,介面也可以有自己帶有實現的方法啦。具體來說是要用default來修飾的方法,其可以像類中的方法一樣有執行語句。在實現介面時,可以不實現其default方法,並且實現類物件可以呼叫其介面的default方法。當然也可以在實現類中覆蓋default方法。

    二.Lambda表示式

    Lambda簡化了匿名內部類的寫法。Java8中可以透過型別推斷來判斷出使用者的意圖,不必將型別等資訊寫全。特別是方法實現體中只有一句語句的實現類,更能加大簡化力度。

    Lambda解決了將一個方法作為引數傳值的問題。解決了一個函式是否可以獨立存在的問題。是Java向函數語言程式設計的一種靠攏。

    一般在某個方法只使用一次的地方使用Lambda表示式;如果方法沒有入參,則只寫一個()->{語句};當只有一個引數,且型別可推斷時,()可省略;如果方法體中只有一條語句花括號可以省略;

    三.函式式介面Functional Interface

    學習了上述Lambda的內容肯定會有一些疑問:如果介面有多個需要實現的方法 呢,還能使用Lambda?如果可以的話Lambda是如何做推斷的。

    答案是,使用Lambda時要求介面中只能有一個抽象方法(透過default修飾的帶有方法體的介面中的方法不是抽象方法)。

    如果一個介面被註解@FunctionalInterface修飾,則該介面只能有一個抽象方法,否則會報錯。

    四.引用類的構造器及方法

    在Lambda中若是直接呼叫了一個方法,且呼叫方法的形參和要實現的介面抽象方法形參一致,則可以進一步簡寫。舉例如下:介面定義:

    Lambda表示式

    引用其他型別的方法

    例子中的方法是Integer類的靜態方法,如果是某個類的例項方法,則應該使用一個物件加::來引用。如,obj::func;如果要呼叫的一個構造方法(抽象方法返回的是一個物件),則應該這樣使用:Integer::new。用new代替構造方法名字。五.Lambda訪問外部變數及介面預設方法

    訪問區域性變數

    可以訪問區域性的final變數,但不能修改。與匿名內部類不同的是,外部變數不需要顯示地宣告為final,但卻要有final的特點,不能被修改,在Lambda之後被修改也不行。

    訪問成員變數和靜態變數可以任意讀寫,舉例如下:

    訪問介面的預設方法在匿名類中可以訪問介面定義的預設方法,在Lambda中不可以訪問。

    六.內建函式式介面

    Java8中內建了許多函式式介面,包括Comparator和Runnable等,它們被添加了@FunctionalInterface註解,以用來支援Lambda表示式。

    6.1Predicate斷言

    檢視原始碼,這個函式式介面中要實現的方法為:boolean test(T t); 即一個判斷傳入值真假的方法,當然判斷的規則由你自己定義。如定義一個判斷字串長度是否大於10的Predicate:

    6.2 Function

    查其原始碼,需要實現一個R apply(T t)的方法。這個介面提供鏈式呼叫、組合的功能。

    6.3 Supplier

    Supplier<Person> personSupplier = Person::new;personSupplier.get();

    6.4 Consumer

    ??Consumer<Person> greeter = (p) -> System.out.println("Hello, " + p.firstName);greeter.accept(new Person("Luke", "Skywalker"));

    6.5 Optional

    參考資料

    七.Stream流

    什麼是Stream流?參考資料Stream流提供了一種對集合Collection的方便的操作。分為“中間操作”和“終端操作”兩種。中間操作的結果還是返回一個Stream,可以繼續操作;而終端操作會返回一個結構不能繼續流操作了。

    要使用Sream首先要透過Collection的Stream方法獲取一個Stream物件。

    7.1 Filter過濾 中間操作

    篩選出集合中滿足一定條件的元素。Stream有一個filter方法,入參是一個Predicate,篩選結果是Predicate.test為true的集合的Stream。下面來看一個篩選出String集合中以"s"開頭的String的程式:

    7.2 Sorted排序 中間操作

    可以給sorted()方法傳入一個Comparator用來自定義排序,否則將使用預設排序規則。

    7.3 Map

    map方法入參為一個Function函式式介面。呼叫map方法將對集合中的每一個元素執行一下Function中的apply方法,並返回由其返回值組成的集合的流。

    舉例:將表示數字的字串集合全部轉換為數字再加一後輸出。

    7.4Match匹配

    是種終端操作,結果不是stream物件,而是boolean值根據Predicate指定的規則判斷集合中是否有匹配的,有的話返回true。有三種形式,anyMatch:有一個匹配就返回true。allMatch:全部匹配返回true。noneMatch:全部不匹配返回true。

    7.5 Count計數

    終端操作,統計stream中元素的個數。

    7.6 Reduce

    list[0]和list[1]執行操作,得到的結果為result。result再和list[2]執行操作,得到的結果result。依次進行,對所有元素執行一遍。

    根據上述描述也可以看出,這裡的“操作”必須滿足兩個入參、返回值是同一型別的。

    reduce方法的入參是:BinaryOperator<T> 這裡的T就是集合的元素型別。

    舉例:求Integer集合中所有元素的和。

    注意:reduce的返回值為Optional<T>

  • 中秋節和大豐收的關聯?
  • 新手學習css語言的技巧是什麼?