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
- java8新特性學習Java
- C++ 11 新特性 nullptr 學習C++Null
- JDK11新特性學習(一)JDK
- JDK11新特性學習(二)JDK
- Automatic Reference Counting(ARC)特性學習(iOS5新特性學習之五)iOS
- jdk-1.8新特性學習筆記JDK筆記
- JDK8新特性學習總結JDK
- JDK8 新特性學習筆記JDK筆記
- 一起學習React18 新特性React
- 學習筆記~1.4 HTML5新特性筆記HTML
- 天天學習ORACLE(三)-11G新特性Oracle
- JDK5.0新特性的學習--列舉JDK
- JDK 新特性學習筆記之模組系統JDK筆記
- JDK5.0新特性的學習--泛型(下)JDK泛型
- JDK5.0新特性的學習--泛型(上)JDK泛型
- [Java學習筆記]JDK1.8新特性學習(一)Lambda表示式Java筆記JDK
- ORACLE 10G 新特性(INCREMENTALLY UPDATED BACKUPS)學習Oracle 10gREM
- JDK5.0新特性的學習--後設資料JDK
- JDK5.0新特性的學習--靜態匯入JDK
- 面試官:知道Java1.8中新加的StampedLock嗎?面試Java
- OceanBase學習之路11|體驗 DDL 新特性(Oracle 模式)Oracle模式
- OceanBase學習之路12|體驗 DDL 新特性(MySQL 模式)MySql模式
- JDK5.0新特性的學習--可變長引數JDK
- Solidity初學-0.8新特性Solid
- 推薦一個學習php8的新特性的文件PHP
- 深圳Java培訓學習:Java8.0新特性之Lambda表示式Java
- PHP開發者應該學習、會用10個PHP7新特性PHP
- 2019 年的 JavaScript 新特性學習指南 | 掘金年度徵文JavaScript
- PHP7 中我們應該學習會用的新特性PHP
- cocos2D-x初探學習筆記(31)2.1新特性CCPhysicsSprite筆記CSS
- 學習Rust泛型與特性Rust泛型
- C#特性學習筆記C#筆記
- Python學習之高階特性Python
- oracle flashback特性學習總結Oracle
- 新特性
- Oracle11新特性——PLSQL新特性(七)OracleSQL
- Oracle11新特性——PLSQL新特性(六)OracleSQL