何用Java8 Stream API进行数据抽取与收集

上一篇中咱们经过一个实例看到了Java8 Stream API 相较于传统的的Java 集合操做的简洁与优点,本篇咱们依然借助于一个实际的例子来看看Java8 Stream API 如何抽取及收集数据。
备注:上一篇内容:如何用Java8 Stream API找到心仪的女友html

## 目标&背景
咱们以“处理订单数据”为例,假设咱们的应用是一个分布式应用,有"订单应用","物流应用","商品应用”等都是独立的服务。本次咱们的目的须要展现订单列表完整数据:java

  • 1.查询订单列表。
  • 2.批量查询物流信息。
  • 3.将物流信息填充到订单主信息中。

假设咱们定义了一个订单类,具备几个关键的属性:订单号,状态,订单价,快递信息。以下所示:express

class Order{
    String orderSeq;
    String status;
    double totalPrice;
    String expressInfo;
    // 省略get,set及hashCode等方法
}

咱们定义了一个快递信息类,几个关键的属性:订单号,物流公司,物流单号,物流状态。以下所示:网络

class ExpressInfo{
    String orderSeq;
    String expressName;
    String expressNo;
    String createTime;
    String statusInfo;
    // 省略get,set及hashCode等方法
}

Java7 实现

获取订单列表 & 抽取订单号

List<Order> orderList = getOrderList();
    // 抽取 订单号
    List<String> orderSeqList = new ArrayList<>();
    for (Order order : orderList) {
        orderSeqList.add(order.getOrderSeq());
    }

这里咱们获取了订单列表orderList,此时expressInfo里边是没有数据的。这里抽取单号依然是Java传统的写法。分布式

批量查询快递信息 & 组装 订单-快递信息 map

因为咱们是经过调用远程服务来获取快递信息,为了减小网络通讯次数,咱们采起批量查询的方式。这也是为何,上一步中咱们要抽取订单号
下面咱们来获取快递信息code

// 调用远程服务,
List<ExpressInfo> expressInfos = RpcGetExpressInfoBatch(orderSeqList);
// 组装 订单-快递 关系map
Map<String,String> orderExpressMap = new HashMap<>();
for(ExpressInfo e: expressInfos){
    orderExpressMap.put(e.getOrderSeq(),e.getStatusInfo());
}

这里组装map,也依然是Java7经常使用的写法。htm

组合数据,将快递信息填充进订单

for(Order order:orderList){
    String expressInfo = orderExpressMap.get(order.getOrderSeq());
    order.setExpressInfo(expressInfo);
}

至此,咱们使用Java7 的写法,完成了开篇设定的目标。下面咱们看Java8的写法对象

Java8 实现

获取订单列表 & 抽取订单号

// 获取列表
List<Order> orderList = getOrderList();
// 抽取单号
List<String> orderSeqs = orderList.stream()
        .map(Order::getOrderSeq)
        .collect(Collectors.toList());

这里咱们使用了stream.map,在map()中,咱们的写法是Order::getOrderSeq表示调用Order对象的getOrderSeq()方法来抽取订单号。
这里的::叫“方法应用”,是Java8中的新写法。
map()后面紧跟的是collect收集器,他将抽取的数据toList(),因而咱们获得了最终的List blog

批量查询快递信息 & 组装 订单-快递信息 map

下面咱们仍然是经过远程调用来获取快递信息,而后使用Java8的语法创建一个 订单-快递 关联信息的map。get

List<ExpressInfo> expressInfos = RpcGetExpressInfoBatch(orderSeqList);
Map<String,String> orderExpressMap =expressInfos.stream()
        .collect(Collectors.toMap(ExpressInfo::getOrderSeq,ExpressInfo::getStatusInfo));

这里代码比Java7的要少吧,且一目了然,这里用strean().collect来收集数据,收集成什么形式呢?看名知意,Collectors.toMap收集成Map,收集什么数据呢?toMap()中,写了ExpressInfo::getOrderSeqExpressInfo::getStatusInfo,即:抽取orderSeq做为key,statusInfo做为value。

至此,订单数据,订单-物流关系数据map都获得了,下面咱们来组合数据。

组合数据,将快递信息填充进订单

通过上面啰嗦的两步,咱们获得了符合咱们要求的数据,如今咱们须要根据颜值高低进行排名,代码以下:

orderList.stream().forEach(o -> o.setExpressInfo(orderExpressMap.get(o.getOrderSeq())));

你没看错,就只有这么一行。

总结

本节,咱们使用Java8 Stream API,完成了数据的抽取和收集,使用了map(),和collect()来完成数据的抽取和收集,并了解了两种收取方式toListtoMap。因此,之后若是有人问你"Java8 stream 如何获取对象的某个属性list啊?",“java8 stream 如何获取指定数据组装成map啊?”,你就能够把本文中的方法告诉他了。

除此以外,Java8 Streap API 还有分组 等功能,后面再说。你也能够关注个人公众号,第一时间收到推送。

alt 逃离沙漠公众号

相关文章
相关标签/搜索