乐字节-Java8新特性-接口默认方法之Stream流(下…
2019-04-11 09:55:18来源:博客园 阅读 ()
接上一篇:《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
*/