乐字节-Java8新特性-接口默认方法之Stream流(下)

JAVA学习网 2019-04-11 16:22:03

接上一篇:《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
    */
   @Override
   public boolean equals(Object obj) {
       boolean flag = false;
       if (obj == null) {
           return flag;
      }
       Order order = (Order) obj;
       if (this == order) {
           return true;
      } else {
           return (this.orderNo.equals(order.orderNo));
      }
  }

   /**
阅读(2427) 评论(0)