基于Java8 Stream API实现数据抽取收集

 更新时间:2020年03月03日 10:16:01   作者:逃离沙漠  
这篇文章主要介绍了基于Java8 Stream API实现数据抽取收集,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

目标&背景

我们以“处理订单数据”为例,假设我们的应用是一个分布式应用,有"订单应用","物流应用","商品应用”等都是独立的服务。本次我们的目的需要展示订单列表完整数据:

1.查询订单列表。

2.批量查询物流信息。

3.将物流信息填充到订单主信息中。

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

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

由于我们是通过调用远程服务来获取快递信息,为了减少网络通信次数,我们采取批量查询的方式。这也是为什么,上一步中我们要抽取订单号

下面我们来获取快递信息

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

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

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

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。

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

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

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::getOrderSeq及ExpressInfo::getStatusInfo,即:抽取orderSeq作为key,statusInfo作为value。

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

组合数据,将快递信息填充进订单#
经过上面啰嗦的两步,我们得到了符合我们要求的数据,现在我们需要根据颜值高低进行排名,代码如下:

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

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

总结#
本节,我们使用Java8 Stream API,完成了数据的抽取和收集,使用了map(),和collect()来完成数据的抽取和收集,并了解了两种收取方式toList和toMap。所以,以后如果有人问你"Java8 stream 如何获取对象的某个属性list啊?",“java8 stream 如何获取指定数据组装成map啊?”,你就可以把本文中的方法告诉他了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • java自旋锁和JVM对锁的优化详解

    java自旋锁和JVM对锁的优化详解

    这篇文章主要为大家介绍了java自旋锁和JVM对锁的优化示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • Java中的CountDownLatch闭锁详解

    Java中的CountDownLatch闭锁详解

    这篇文章主要介绍了Java中的CountDownLatch闭锁详解,CountDownLatch用给定的计数初始化,await属于阻塞方法,直到当前计数达到零,由于countDown方法被调用,然后释放所有await等待的线程,并立即返回线程后续的await调用逻辑,需要的朋友可以参考下
    2023-12-12
  • Java String、StringBuffer与StringBuilder的区别

    Java String、StringBuffer与StringBuilder的区别

    本文主要介绍Java String、StringBuffer与StringBuilder的区别的资料,这里整理了相关资料及详细说明其作用和利弊点,有需要的小伙伴可以参考下
    2016-09-09
  • Netty实战入门教程之 什么是Netty

    Netty实战入门教程之 什么是Netty

    Java中支持三种网络编程IO模型,BIO、NIO、AIO,Netty对NIO又做了一层封装,本文带领我们了解Netty到底是什么,Netty入门案例,感兴趣的朋友跟随小编一起看看吧
    2022-02-02
  • Netty分布式flush方法刷新buffer队列源码剖析

    Netty分布式flush方法刷新buffer队列源码剖析

    这篇文章主要为大家介绍了Netty分布式flush方法刷新buffer队列源码剖析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • Java多线程中线程的两种创建方式及比较代码示例

    Java多线程中线程的两种创建方式及比较代码示例

    这篇文章主要介绍了Java多线程中线程的两种创建方式及比较代码示例,简单介绍了线程的概念,并行与并发等,然后通过实例代码向大家展示了线程的创建,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Java经验点滴:类注释文档编写方法

    Java经验点滴:类注释文档编写方法

    Java经验点滴:类注释文档编写方法...
    2006-12-12
  • Java链表(Linked List)基本原理与实现方法入门示例

    Java链表(Linked List)基本原理与实现方法入门示例

    这篇文章主要介绍了Java链表(Linked List)基本原理与实现方法,结合实例形式分析了Java链表(Linked List)的功能、原理、实现方法与操作注意事项,需要的朋友可以参考下
    2020-03-03
  • MyBatis @Select注解介绍:基本用法与动态SQL拼写方式

    MyBatis @Select注解介绍:基本用法与动态SQL拼写方式

    这篇文章主要介绍了MyBatis @Select注解介绍:基本用法与动态SQL拼写方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • Java的HashTable源码解读

    Java的HashTable源码解读

    这篇文章主要介绍了Java的HashTable源码解读,HashTable继承了Dictionary类,提供了一些字典相关的基本功能如添加、删除、判空、获取元素数量等,需要的朋友可以参考下
    2023-12-12

最新评论