---
# System prepended metadata

title: JAVA 8 學習心得
tags: [學習筆記, JAVA]

---


# JAVA 8 學習心得

以前學的是JAVA6，到現階段8成為主流之後，是時候學習JAVA8的新特性了。

* ### stream 
  類似操作sql語法的操作效果，可以大量減少中間操作性的代碼量
    > .stream() 回傳一個table (from table)
      .sorted() 將table的記錄作排序
      .filter() 過濾方法，條件為真才保留 (where condition)
      .max/min/sum/average...etc 統計上的aggregation
 
* ### interface可以有==實作==
  JAVA8使用default/static當成實作method的關鍵字，範例如下：
    ```java 
    public interface MyFunctionalInterface2{
        public void execute();

        public default void print(String text) {
            System.out.println(text);
        }

        public static void print(String text, PrintWriter writer) throws IOException {
            writer.write(text);
        }
    }
    ```
    **．static方法可由 ==InterfaceName.方法名稱()== 直接呼叫。**
    **．而default方法則由實作類別呼叫。實際例子如Iterable利用"default"來實作forEach，而其底下的實作類不需重新實作它。**
    
* ### Functional Interfaces
    * 當定義的interface只有1個(且只有1個)未實作函式時，可以用lambda表達式來對它實作。
    * 調用時用apply(參數)，或直接用 lambda 的語法: input -> body
        例如：
        ```java
        (arg1, arg2, arg3) -> System.out.println(arg1+arg2+arg3);
        ```
    * Function / Supplier / Consumer / Predicate 內容如下：
         
             Function<T,R>: 1個參數T傳入，1個結果R回傳
             Supplier<R>: 0個參數T傳入，1個結果R回傳
             Consumer<T>: 1個參數T傳入，0個結果R回傳
             Predicate<T>: 1個參數T傳入，1個布林值結果R回傳
         
    * 函式前綴帶上Bi時，功能相同，但arguments由1個變為2個，例如 BiFunction<T1, T2, R>
    
* Optional是一個容器類，旨在避免或釐清null在語音上的二義性：**執行異常** 或 **查無結果**

    * Optional.of()使用時機:
        * 當容器的對象不太可能為 null 時使用，發生 NullPointException 則視為 **執行異常**(系統異常)。
        
    * Optional.ofNullable()使用時機:
        * 當容器的對象『有可能』為 null 時使用，發生 NoSuchElementException 則視為 **查無結果**(運作正常)。
        
    * ifPresent() / .orElse() 等方法可用來實作 callback 內容。
    
###### tags: `學習筆記` `JAVA` 