1. 程式人生 > 資訊 >高途 CEO 迴應上萬裁員:線上教育將減 少 70% 上課時間

高途 CEO 迴應上萬裁員:線上教育將減 少 70% 上課時間

whats new in Java8: https://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html 1. lambda表示式
  • http://www.importnew.com/26080.html
  • Java8 lambda表示式10個示例http://www.importnew.com/16436.html
  • 為什麼要用lambda
    • 又稱閉包或匿名函式,用來代替匿名內部類
    • 使程式碼變的更加緊湊
    • new Thread(() -> System.out.println("Hello World!")).start();
  • 修改方法的能力:函式中可以接受以函式為單元的引數
    • String []datas = new String[] {"peng","zhao","li"};
    • Arrays.sort(datas,(v1 , v2) -> Integer.compare(v1.length(), v2.length()));
  • 語法
    • 單行表示式
    • (params) -> an expression
    • 多個語句塊
    • (params) -> {expressions;};
    • 沒有引數,用空括號表示
    • () -> {for (int i = 0; i < 1000; i++) doSomething();};`
    • Java是一個強型別的語言,因此引數必須要有型別,如果編譯器能夠推測出Lambda表示式的引數型別,則不需要我們顯示的進行指定
      • Arrays.sort(datas,(v1, v2) -> Integer.compare(v1.length(), v2.length()));
      • 編譯器會根據Lambda表示式對應的函式式介面Comparator進行自動推斷
    • 如果Lambda表示式只有一個引數,並且引數的型別是可以由編譯器推斷出來的
      • Stream.of(datas).forEach(param -> {System.out.println(param.length());});`
      • Lambda表示式的返回型別,無需指定,編譯器會自行推斷,說是自行推斷
      • 引數可以使用修飾符及註解,如final、@NonNull等
  • 方法引用
    • String []datas = new String[] {"peng","Zhao","li"};
    • Arrays.sort(datas,String::compareToIgnoreCase);
    • Stream.of(datas).forEach(System.out::println);
    • 方法引用的具體分類
      • Object:instanceMethod
      • Class:staticMethod
      • Class:instanceMethod
    • 兩種在Lambda表示式的意義上等同
      • System.out::println == x -> System.out.println(x);
      • String::compareToIgnoreCase == (x,y) -> x.compareToIgnoreCase(y)
  • java 8中內部類或者Lambda表示式對外部類變數的引用,不要求強制的加上final關鍵字了,但是Java 8中要求這個變數是effectively final(有效只讀變數,一旦定義後,在後面就不能再隨意修改)
``` String []datas = new String[] {"peng","Zhao","li"}; datas = null; new Thread(() -> System.out.println(datas)).start(); //compile error ```
  • Java中內部類以及Lambda表示式中也不允許修改外部類中的變數,這是為了避免多執行緒情況下的race condition
  • 缺點
    • variable used in lambda expression should be final or effectively final
    • lambda和inner class中的變數都得是final
    • 如果在匿名類或 Lambda 表示式中訪問的區域性變數,如果不是 final 型別的話,編譯器自動加上 final 修飾符
``` String version = "1.8"; version = "1.7"; //註釋掉這行或下行中另一行才能編譯通過 foo(() -> version ); //這行讓編譯器決定給 version 加上 final 屬性 ```
  • 解釋:為什麼 Lambda 表示式(匿名類) 不能訪問非 final 的區域性變數呢?因為例項變數存在堆中,而區域性變數是在棧上分配,Lambda 表達(匿名類)會在另一個執行緒中執行。如果線上程中要直接訪問一個區域性變數,可能執行緒執行時該區域性變數已經被銷燬了,而 final 型別的區域性變數在 Lambda 表示式(匿名類) 中其實是區域性變數的一個拷貝。
2. 介面的預設方法
  • 在Java8種引入新的機制,支援在介面中宣告方法同時提供實現
  • 這令人激動不已,你有兩種方式完成
    • 1.在介面內宣告靜態方法
    • 2.指定一個預設方法
      • 比如List介面中添加了sort方法
      • Java8操作集合的時候可以直接foreach的原因也是在Iterable介面中也新增了一個預設方法:forEach
3. 流API
  • 集合介面有兩個方法來生成流:
4. 方法引用
  • 方法引用使用一對冒號::
  • names.forEach(System.out::println);
  • Arrays.sort(arr, Comparator.comparing(SupplierHS::getCorpId).thenComparing(SupplierHS::getCorpName));
5.FunctionalInterface
  • 函式式介面(Functional Interface)就是一個有且僅有一個抽象方法,但是可以有多個非抽象方法的介面。
  • java8中用lambda表示式代替匿名內部類,本質上是將介面定義為函式式介面,並將函式式介面隱式轉換為lambda表示式
  • Predicate介面適合用於過濾,測試物件是否符合某個條件,唯一抽象方法是 boolean test(T t)
6. LocalDate、LocalTime、LocalDateTime
  • 為什麼需要LocalDate、LocalTime、LocalDateTime
    • Date如果不格式化,打印出的日期可讀性差
    • Date對時間處理比較麻煩,比如想獲取某年、某月、某星期,以及n天以後的時間
    • 使用SimpleDateFormat對時間進行格式化,但SimpleDateFormat是執行緒不安全的
    • 解決SimpleDateFormat非執行緒安全問題?
      • 方法一:用DateTimeFormatter和FastDateFormat替換
      • 方法二:每次都建立新的SimpleDateFormat物件
      • 方法三:使用ThreadLocal保證每個執行緒最多隻建立一次
  • LocalDate,只會獲取年月日
    • LocalDate.now()
    • LocalDate.of(2019,9,10)
    • intyear=localDate.getYear();
  • LocalTime,只會獲取幾點幾分幾秒
    • LocalTime.of(13,51,10)
  • LocalDateTime=LocalDate+LocalTime
    • 轉instant:localDateTime.toInstant(ZoneOffset.of("+8"))
  • Instant,獲取秒數、毫秒數
    • 可用來與Date物件轉換
      • new Date(instant.toEpochMilli())
      • Date.from(instant)
  • 格式化
LocalDatelocalDate=LocalDate.of(2019,9,10); Strings1=localDate.format(DateTimeFormatter.BASIC_ISO_DATE); Strings2=localDate.format(DateTimeFormatter.ISO_LOCAL_DATE); //自定義格式化 DateTimeFormatterdateTimeFormatter=DateTimeFormatter.ofPattern("dd/MM/yyyy"); Strings3=localDate.format(dateTimeFormatter); 8. Optional 類
  • 目的:減少空指標異常
  • https://www.cnblogs.com/zhangboyu/p/7580262.html
  • Optional.ofNullable(user),user可能為null
  • Optional.of(user),user不允許為null,否則報空指標
  • optional.get(),如果value為null,則報錯:NoSuchElementException
  • optional.isPresent(),return value != null
  • optional.ifPresent(consumer)
  • optional.orElse(other),有值返回,無值返回other
  • optional.orElseGet(supplier)。
    • 與orElse的區別,有值的時候不會執行supplier
  • optional.orElseThrow(SupplierexceptionSupplier) throws X
  • optional.map((a) -> a.getName())
  • optional.flatmap((a) -> a.getName())
    • Funcation引數的返回值為Optional,flatmap返回解除包裝的 String 值
  • optional.filter(predicate)
  • 鏈式
Stringresult=Optional.ofNullable(user) .flatMap(User::getAddress) .flatMap(Address::getCountry) .map(Country::getIsocode) .orElse("default");
  • 用例
List<User>users=newArrayList<>(); Useruser=users.stream().findFirst().orElse(newUser("default","1234"));
  • Optional不是Serializable。因此,它不應該用作類的欄位