高途 CEO 迴應上萬裁員:線上教育將減 少 70% 上課時間
阿新 • • 發佈:2021-08-05
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(有效只讀變數,一旦定義後,在後面就不能再隨意修改)
- Java中內部類以及Lambda表示式中也不允許修改外部類中的變數,這是為了避免多執行緒情況下的race condition
- 缺點
- Java8 Lambda表示式和流操作如何讓你的程式碼變慢5倍
- http://www.importnew.com/17262.html
- 坑
- variable used in lambda expression should be final or effectively final
- lambda和inner class中的變數都得是final
- 如果在匿名類或 Lambda 表示式中訪問的區域性變數,如果不是 final 型別的話,編譯器自動加上 final 修飾符
- 解釋:為什麼 Lambda 表示式(匿名類) 不能訪問非 final 的區域性變數呢?因為例項變數存在堆中,而區域性變數是在棧上分配,Lambda 表達(匿名類)會在另一個執行緒中執行。如果線上程中要直接訪問一個區域性變數,可能執行緒執行時該區域性變數已經被銷燬了,而 final 型別的區域性變數在 Lambda 表示式(匿名類) 中其實是區域性變數的一個拷貝。
- 在Java8種引入新的機制,支援在介面中宣告方法同時提供實現
- 這令人激動不已,你有兩種方式完成
- 1.在介面內宣告靜態方法
- 2.指定一個預設方法
- 比如List介面中添加了sort方法
- Java8操作集合的時候可以直接foreach的原因也是在Iterable介面中也新增了一個預設方法:forEach
- 集合介面有兩個方法來生成流:
- stream()− 為集合建立序列流。
- parallelStream()− 為集合建立並行流
- 當使用序列方式去遍歷時,每個 item 讀完後再讀下一個 item。
- 而使用並行去遍歷時,資料會被分成多個段,其中每一個都在不同的執行緒中處理,然後將結果一起輸出。Stream 的並行操作依賴於 Java7 中引入的 Fork/Join 框架(JSR166y)來拆分任務和加速處理過程
- 安全問題:https://www.cnblogs.com/puyangsky/p/7608741.html
- Fork/Join 框架:https://infoq.cn/article/fork-join-introduction
- https://www.imooc.com/article/33768
- https://www.cnblogs.com/xxuan/p/7324009.html
- 陣列轉stream,Arrays.stream(values())
- 流式計算原理
- https://mp.weixin.qq.com/s/rTnZYd0-UIPeF1tuP48cpA
- Stream上的所有操作分為兩類:中間操作和結束操作
- 中間操作是懶惰的,只有遇見結束操作才會回溯所有的中間操作,並觸發實際計算。有狀態的中間操作必須等到所有元素處理之後才知道最終結果。
- https://mp.weixin.qq.com/s?__biz=MzU2MTI4MjI0MQ==&mid=2247499983&idx=1&sn=fecffbef5127b8cfba7e34742223851c
- apis
- skip(n),跳過前n個元素
- 方法引用使用一對冒號::
- names.forEach(System.out::println);
- Arrays.sort(arr, Comparator.comparing(SupplierHS::getCorpId).thenComparing(SupplierHS::getCorpName));
- 函式式介面(Functional Interface)就是一個有且僅有一個抽象方法,但是可以有多個非抽象方法的介面。
- java8中用lambda表示式代替匿名內部類,本質上是將介面定義為函式式介面,並將函式式介面隱式轉換為lambda表示式
- Predicate介面適合用於過濾,測試物件是否符合某個條件,唯一抽象方法是 boolean test(T t)
- 為什麼需要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)
- 格式化
- immutable
- LocalDate、LocalTime、LocalDateTime、Instant為不可變物件
- https://mp.weixin.qq.com/s/bTC-ooiViG9IreMTndGpMw
- 目的:減少空指標異常
- 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)
- 鏈式
- 用例
- Optional不是Serializable。因此,它不應該用作類的欄位