Java1.8新特性學習
Java1.8新特性學習
第一部分:Optional
簡單介紹Optional的API
- empty:返回一個空的Optional物件
- of:入參:Object,返回一個Optional物件,如果入參是一個null,就會報空指標異常
- ofNullable:入參Object,返回一個Optional物件,如果入參是一個null,會返回一個空的Optional物件
- get: 如果Optional物件中有值就返回相應的值,如果沒有值就報空指標異常
orElse:入參:Object,如果Optional物件中有個值得話,就返回這個值,不會返回入參;如果沒有值,就會返回入參
測試程式碼: Optional<Object> empty = Optional.ofNullable(null); System.out.println("empty:"+empty.orElse("李四")); Optional<String> optional = Optional.ofNullable("張三"); System.out.println("optional:"+optional.orElse("zhangsan")); 結果: empty:李四 optional:張三
orElseGet :入參Supplier,如果optional物件中有資料,就會返回這個值,不會返回入參;如果沒有值,就會返回入參
//測試orElseGet功能 System.out.println("==================測試orElseGet功能======================"); Optional<Object> empty_orElseGet = Optional.ofNullable(null); System.out.println("empty:"+empty.orElseGet(()->"李四")); Optional<String> optional_orElseGet = Optional.ofNullable("張三"); System.out.println("optional:"+optional.orElseGet(()->"zhangsan")); 結果: empty:李四 optional:張三 原始碼: public T orElseGet(Supplier<? extends T> other) { return value != null ? value : other.get(); }
orElseThrow:入參:指定一個異常;如果optional物件中有資料,就會返回這個值,不會報異常資訊,如果沒有值,就會報指定的異常資訊
//測試orElseThrow功能 System.out.println("==================測試orElseThrow功能======================"); Optional<String> optional_orElseThrow = Optional.ofNullable("張三"); System.out.println("optional_orElseThrow:"+optional.orElseThrow(RuntimeException::new)); Optional<Object> empty_orElseThrow = Optional.ofNullable(null); System.out.println("empty_orElseThrow:"+empty.orElseThrow(RuntimeException::new));
filter:入參Predicate,如果optional中的值滿足條件,就返回一個含有這個值得optional物件,否則返回一個空的option物件
System.out.println("==================測試filter功能======================"); Optional<String> stringOptional = Optional.ofNullable("zhangsan"); System.out.println(stringOptional.filter(temp->temp.length()>5)); stringOptional=Optional.empty(); System.out.println(stringOptional.filter(temp->temp.length()>5)); 結果: zhangsan Optional.empty
filter注意事項:Optional中的filter方法和Stream中的filter方法是有點不一樣的,Stream中的filter方法是對一堆元素進
行過濾,而Optional中的filter方法只是對一個元素進行過濾,可以把Optional看成是最多隻包含一個元素
的Streammap:如果Option物件中有值可以對其進行修改,.返回值是一個含有這個值得Optional物件
//測試map功能 System.out.println("==================測試map功能======================"); Optional<String> stringOptional_map = Optional.ofNullable("zhangsan"); System.out.println(stringOptional_map.map(temp->temp.toUpperCase()).orElse("失敗")); stringOptional_map=Optional.empty(); System.out.println(stringOptional.map(temp->temp.toUpperCase()).orElse("失敗")); 結果: ZHANGSAN 失敗
flagMap:如果建立的Optional中的值存在,就對該值執行提供的Function函式呼叫,返回一個Optional型別的值,否
則就返回一個空的Optional物件.flatMap與map(Funtion)方法類似,區別在於flatMap中的mapper返回
值必須是Optional,map方法的mapping函式返回值可以是任何型別T。呼叫結束時,flatMap不會對結果
用Optional封裝。System.out.println("==================測試flagMap功能======================"); Optional<String> stringOptional_flagMap = Optional.ofNullable("zhangsan"); System.out.println(stringOptional_flagMap.flatMap(temp-> Optional.of("list"))); stringOptional_flagMap=Optional.ofNullable(null); System.out.println(stringOptional_flagMap.flatMap(temp-> Optional.of("list")));
ifPresent://ifPresent方法的引數是一個Consumer的實現類,Consumer類包含一個抽象方法,該抽象方法對傳入的值進行處理,只處理沒有返回值。
Optional stringOptional = Optional.of(“zhangsan”); stringOptional.ifPresent(e-> System.out.println(“我被處理了。。。”+e));
第二部分:Lambda表示式
Lambda 基本語法
(parameters) -> expression
或
(parameters) ->{ statements; }
- 做幾點說明:
1. 可選的引數宣告:可以宣告引數的型別,編輯器可以統一識別
2. 可選的引數圓括號:一個引數無需定義圓括號,但多個引數需要定義圓括號。
3. 可選的大括號:如果主體包含了一個語句,就不需要使用大括號。
4. 可選的返回關鍵字:如果主體只有一個表示式返回值則編譯器會自動返回值,大括號需要指定明表示式返回了一個數值。
第一個例項:開啟一個執行緒
//第一個例子,開啟一個執行緒
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(addNum(1,2));
}
}).start();
new Thread(()-> System.out.println(addNum(1,2))).start();
//私有方法
private static int addNum(int arg1,int arg2){
return arg1+arg2;
}
第二個例子:使用表示對集合進行迭代
//對集合進行迭代
List<Integer> list = list();
for (Integer integer : list) {
System.out.println(integer);
}
list.forEach(System.out::println);
//生成一個隨機數集合
private static List<Integer> list (){
List<Integer> listNum = new ArrayList<>();
for (int i= 0 ; i<10 ;i++){
int random = new Random().nextInt(100);
listNum.add(random);
}
return listNum;
}
第三個例子:使用表示式filter過濾
** List<String> list = stringList();
list.forEach(System.out::println);
//過濾的條件
Predicate<String>startWith=(n)->n.length()>3;
list.stream().filter(startWith).collect(Collectors.toList()).forEach(System.out::println);**
//隨機生成一個字串
private static String string(){
String str ="ABCDEFGHIJKMNOPQRSTUVWSYZ";
StringBuilder stringBuilder = new StringBuilder();
int r = new Random().nextInt(5);
for (int i = 0; i <r+1 ; i++) {
int random = new Random().nextInt(str.length());
char charAt = str.charAt(random);
stringBuilder.append(charAt);
}
return stringBuilder.toString();
}
//生成一個字元創的集合
private static List<String> stringList(){
List<String> list = new ArrayList<>();
for (int i = 0; i <10 ; i++) {
list.add(string());
}
return list;
}
相關文章
- JDK 1.8 新特性學習(Stream)JDK
- Automatic Reference Counting(ARC)特性學習(iOS5新特性學習之五)iOS
- JDK11新特性學習(二)JDK
- JDK11新特性學習(一)JDK
- C++ 11 新特性 nullptr 學習C++Null
- JDK8 新特性學習筆記JDK筆記
- jdk-1.8新特性學習筆記JDK筆記
- JDK8新特性學習總結JDK
- 學習筆記~1.4 HTML5新特性筆記HTML
- 一起學習React18 新特性React
- [Java學習筆記]JDK1.8新特性學習(一)Lambda表示式Java筆記JDK
- 2019 年的 JavaScript 新特性學習指南 | 掘金年度徵文JavaScript
- JDK 新特性學習筆記之模組系統JDK筆記
- OceanBase學習之路11|體驗 DDL 新特性(Oracle 模式)Oracle模式
- OceanBase學習之路12|體驗 DDL 新特性(MySQL 模式)MySql模式
- Solidity初學-0.8新特性Solid
- 學習七、ES2016與ES2017的新特性
- 面試官:知道Java1.8中新加的StampedLock嗎?面試Java
- 通過示例來學習ES2016, 2017, 2018的新特性
- 推薦一個學習php8的新特性的文件PHP
- Python學習之高階特性Python
- 深圳Java培訓學習:Java8.0新特性之Lambda表示式Java
- cocos2D-x初探學習筆記(31)2.1新特性CCPhysicsSprite筆記CSS
- 學習Rust泛型與特性Rust泛型
- C#特性學習筆記C#筆記
- 新特性
- Go型別特性-學習筆記Go型別筆記
- Flutter學習之Dart語法特性FlutterDart
- PHP開發者應該學習、會用10個PHP7新特性PHP
- 學習 iOS14 新特性,教你如何建立一個優秀的 App ClipiOSAPP
- React 新特性React
- 新特性介面
- Hadoop新特性Hadoop
- Oracle 20c 新特性:XGBoost 機器學習演算法和 AutoML 的支援Oracle機器學習演算法TOML
- VUE 3.0 學習探索入門系列 - Vue3.x 令人期待的新特性(7)Vue
- 正規表示式學習(2)---字元特性字元
- NgRx Selector 的 Memoization 特性學習筆記筆記
- 5個一定要學會的JavaScript新特性JavaScript