java8 Stream API及經常使用方法

java8 Stream API

Stream 流

  1. Stream(流)是一個來自數據源的元素簇,它能夠支持聚合操做。
  2. 數據源:流的數據源,構造流對象的數據源,例如經過一個List來構造Stream對象,這個List就是數據源;
  3. 聚合操做:對Stream對象進行處理後的Stream對象返回指定規則數​​據的操做稱爲聚合操做,過濾器,映射,限制,排序等都是聚合操做。

建立個實體類

public class UmsPermission implements Serializable {
    private Long id;

    @ApiModelProperty(value = "父級權限id")
    private Long pid;

    @ApiModelProperty(value = "名稱")
    private String name;

    @ApiModelProperty(value = "權限值")
    private String value;

    @ApiModelProperty(value = "圖標")
    private String icon;

    @ApiModelProperty(value = "權限類型:0->目錄;1->菜單;2->按鈕(接口綁定權限)")
    private Integer type;

    @ApiModelProperty(value = "前端資源路徑")
    private String uri;

    @ApiModelProperty(value = "啓用狀態;0->禁用;1->啓用")
    private Integer status;

    @ApiModelProperty(value = "建立時間")
    private Date createTime;

    @ApiModelProperty(value = "排序")
    private Integer sort;

    private static final long serialVersionUID = 1L;

    //省略全部getter及setter方法
}


複製代碼

建立流

//建立list
List<UmsPermission> permissionList = new ArrayList();
// 爲集合建立串行流對象
Stream<UmsPermission> stream = permissionList.stream();
// 爲集合建立並行流對象
Stream<UmsPermission> parallelStream = permissionList.parallelStream();

複製代碼

filter 過濾

filter 主要是作篩選用 filte括號裏面結果知足返回true 不知足返回false,返回結果爲return true篩選後的結果前端

// 獲取權限類型爲目錄的權限
// permission 爲permissionList中每個對象 
// permission.getType() 獲取type判斷type是否爲1 返回數據爲type=1的對象
List<UmsPermission> dirList = permissionList.stream()
    .filter(permission -> permission.getType() == 0)
    .collect(Collectors.toList());

// 第二種寫法
List<UmsPermission> dirList = permissionList.stream()
                .filter( permission -> {
                    if (permission.getType() == 0){
                        return true;
                    }
                    return false;
                }).collect(Collectors.toList());


複製代碼

map篩選

map爲獲取map括號裏面return 出來的值java

// 獲取全部權限的id組成的集合
List<Long> idList = permissionList.stream()
    .map(permission -> permission.getId())
    .collect(Collectors.toList());
//第二種寫法
List<Integer> list = permissionList.stream()
                .map(permission -> {
                    return permission.getId();
                }).collect(Collectors.toList());


複製代碼

list獲取指定數量元素

從Stream中獲取指定數量的元素。markdown

// 獲取前3個權限對象組成的集合
List<UmsPermission> firstFiveList = permissionList.stream()
    .limit(3)
    .collect(Collectors.toList());

複製代碼

skip跳過指定下標

// 跳過前5個元素,返回後面的
List<UmsPermission> skipList = permissionList.stream()
    .skip(5)
    .collect(Collectors.toList());

複製代碼

count獲取總數

// count操做:獲取全部目錄權限的個數
long dirPermissionCount = permissionList.stream()
    .filter(permission -> permission.getType() == 0)
    .count();

複製代碼

sorted排序

sorted 排序 括號中返回的爲 -1 0 1spa

// 將全部權限按先目錄後菜單再按鈕的順序排序
  //默認正序
   List<UmsPermission> sortedList = permissionList.stream()
   		.sorted(Comparator.comparing(UmsPermission::getType)).collect(Collectors.toList());
   //倒序 reversed
   List<UmsPermission> sortedList = permissionList.stream()
   		.sorted(Comparator.comparing(UmsPermission::getType).reversed()).collect(Collectors.toList());
  
  //第二種寫法 正序
List<UmsPermission> sortedList = permissionList.stream()
	//permission1 下一個元素的值 permission2 當前元素的值
    .sorted((permission1,permission2)->{
    	//compareTo對比方法介紹
    	//permission1.getType() 小於 permission2.getType() 返回 -1 正序
    	//permission1.getType() 等於 permission2.getType() 返回 0 不排序
    	//permission1.getType() 大於 permission2.getType() 返回 1 倒序
    	return permission1.getType().compareTo(permission2.getType());})
    .collect(Collectors.toList());
 
 

複製代碼

controller方法

// 對象轉Map<Long,UmsPermission> 類型 key:id ,value:對象
 Map<Long, UmsPermission> permissionMap = permissionList.stream()
                .collect(Collectors.toMap(permission -> permission.getId(), permission -> permission ));
 
 // map中key重複用這個加(oldValue, newValue) -> newValue 的方法
 Map<Long, UmsPermission> permissionMap = permissionList.stream()
                .collect(Collectors
                  		//(oldValue, newValue) -> newValue  的做用是當出現同樣的key值得時候如何取捨其中oldValue表明已存在map中的值,newValue表明新值(當前值),示例中取舊值(toMap key重複會報錯) 當前取值爲newValue(當前value覆蓋原來map中的值)
                		.toMap(permission -> permission.getId(), permission -> permission ,(oldValue,newValue)-> newValue));
      
 //轉換爲List<Map<String,Object>>
 List<Map<String,Object>> collect = permissionList.stream()
 		.map(permission -> new BeanMap(permission))
 		.collect(Collectors.toList());  

 //轉換爲Set<Map<String,Object>>
 Set<Map<String,Object>> collect = permissionList.stream()
 		.map(permission -> new BeanMap(permission))
 		.collect(Collectors.toSet());
        		

複製代碼
相關文章
相關標籤/搜索