1. 程式人生 > >Java8中 stream,filter 等功能代替for迴圈(及)isPresent( ) 和 ifPresent() 簡單應用

Java8中 stream,filter 等功能代替for迴圈(及)isPresent( ) 和 ifPresent() 簡單應用

直接上程式碼,比較實在。

物件A

public Class A{
    private Long id;
    private String userName;
  
    ....省略get和set方法  
}

在List<A>中,查詢 userName 為 "小明"  的物件 A。

在java8中,我們可以這麼玩

1,查詢集合中符合條件的第一個物件,如果可以明確條件只能匹配一個,使用上 findFirst(),效能更好。

 Optional<A> firstA= AList.stream() 
                          .filter(a -> "小明".equals(a.getUserName())) 
                          .findFirst();

關於Optional,java API中給瞭解釋。

A container object which may or may not contain a non-null value. If a value is present, isPresent() will return true and get() will return the value.

一個容器物件,它可能包含也可能不包含非空值。如果存在一個值,isPresent()將返回true, get()將返回值。

小結:

Optional 是 Java 語言的有益補充 —— 它旨在減少程式碼中的 NullPointerExceptions

,雖然還不能完全消除這些異常。

它也是精心設計,自然融入 Java 8 函式式支援的功能。

總的來說,這個簡單而強大的類有助於建立簡單、可讀性更強、比對應程式錯誤更少的程式。

Optional 類是一個可以為null的容器物件。如果值存在則isPresent()方法會返回true,呼叫get()方法會返回該物件。

Optional 是個容器:它可以儲存型別T的值,或者僅僅儲存null。Optional提供很多有用的方法,這樣我們就不用顯式進行空值檢測。

Optional 類的引入很好的解決空指標異常。

 所以,我們可以這樣子使用,firstA.isPresent()作為判斷

if (firstA.isPresent()) {
     A a = firstA.get();   //這樣子就取到了這個物件。
}
else {
   //沒有查到的邏輯
}

還可以使用

ifPresent 用於對過濾出的資料如果存在。如果經過過濾條件後,有資料的話就可以進行修改。
 Optional<A> firstA= AList.stream() 
                          .filter(a -> "小明".equals(a.getUserName())) 
                          .findFirst()
                          .ifPresent(a -> {
                              a.setUserName("明明");
                          })

2,如果想返回集合呢。可以使用這個(此處即:返回經過過濾後的集合)

 List<A> aList= AList.stream() 
                      .filter(a -> "小明".equals(a.getUserName())) 
                      .collect(Collectors.toList());

擴充套件:如去掉空

//去掉名稱為空的
        List<A> aList = AList.stream()
                .filter(a-> StringUtil.isNotEmpty(a.getName()))
                .collect(Collectors.toList());

3,抽取物件中所有的id的集合

//map(A::getId) 中的 A 為實體類
List<Long> idList = AList.stream()
                         .map(A::getId)
                         .collect(Collectors.toList());

參考來源: