接上一篇:《Java8新特性之stream》,下麵繼續接著講Stream 5、流的中間操作 常見的流的中間操作,歸為以下三大類:篩選和切片流操作、元素映射操作、元素排序操作: 5.1、篩選和切片 例如以訂單數據為例,在做報表展示時,會根據訂單狀態、用戶信息、支付結果等狀態來分別展示(即過濾和統計展示 ...
接上一篇:《Java8新特性之stream》,下麵繼續接著講Stream
5、流的中間操作
常見的流的中間操作,歸為以下三大類:篩選和切片流操作、元素映射操作、元素排序操作:
操作 | 描述 |
---|---|
篩選和切片 | filter(T -> boolean):保留 boolean 為 true 的元素 limit(long n):返回前 n 個元素 skip(long n):去除前 n 個元素 distinct():去除重覆元素,這個方法是通過類的 equals 方法來判斷兩個元素是否相等的 |
映射 | map(T -> R):將流中的每一個元素 T 映射為 R(類似類型轉換) flatMap(T -> Stream<R>): 將流中的每一個元素 T 映射為一個流,再把每一個流連接成為一個流 |
排序 | sorted() / sorted((T, T) -> int):如果流中的元素的類實現了 Comparable 介面,即有自己的排序規則,那麼可以直接調用 sorted() 方法對元素進行排序,如 Stream<Integer> |
5.1、篩選和切片
例如以訂單數據為例,在做報表展示時,會根據訂單狀態、用戶信息、支付結果等狀態來分別展示(即過濾和統計展示)
定義訂單Order類
public class Order {
// 訂單id
private Integer id;
// 訂單用戶id
private Integer userId;
// 訂單編號
private String orderNo;
// 訂單日期
private Date orderDate;
// 收貨地址
private String address;
// 創建時間
private Date createDate;
// 更新時間
private Date updateDate;
// 訂單狀態 0-未支付 1-已支付 2-代發貨 3-已發貨 4-已接收 5-已完成
private Integer status;
// 是否有效 1-有效訂單 0-無效訂單
private Integer isValid;
//訂單總金額
private Double total;
/**
此處省略getter/setter方法
*/
}
測試
public static void main(String[] args) {
Order order01 = new Order(1,10,"20190301",
new Date(),"上海市-浦東區",new Date(),new Date(),4,1,100.0);
Order order02 = new Order(2,30,"20190302",
new Date(),"北京市四惠區",new Date(),new Date(),1,1,2000.0);
Order order03 = new Order(3,20,"20190303",
new Date(),"北京市-朝陽區",new Date(),new Date(),4,1,500.0);
Order order04 = new Order(4,40,"20190304",
new Date(),"北京市-大興區",new Date(),new Date(),4,0,256.0);
Order order05 = new Order(5,40,"20190304",
new Date(),"上海市-松江區",new Date(),new Date(),4,0,1000.0);
List<Order> ordersList= Arrays.asList(order01,order02,order03,order04);
// 過濾訂單集合 有效訂單 並列印到控制台
ordersList.stream().filter((order)->order.getIsValid()==1).forEach(System.out::println);
// 過濾訂單集合有效訂單 取前兩條有效訂單 並列印到控制台
ordersList.stream().filter((order)->order.getIsValid()==1).limit(2).forEach(System.out::println);
}
// 過濾訂單集合有效訂單 取最後一條記錄
ordersList.stream().filter((order)->order.getIsValid()==1)
.skip(ordersList.size()-2).forEach(System.out::println);
// 去除訂單編號重覆的無效訂單記錄 此時因為比較的為Object Order對象需要重寫HashCode 與Equals 方法
/**
* 重寫 equals 方法
* @param obj
* @return
*/