如何使用Java8 Stream API高效实现数据抽取与汇总?

2026-05-28 04:331阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1193个文字,预计阅读时间需要5分钟。

如何使用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。

如何使用Java8 Stream API高效实现数据抽取与汇总?

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

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

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

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

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

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

本文共计1193个文字,预计阅读时间需要5分钟。

如何使用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。

如何使用Java8 Stream API高效实现数据抽取与汇总?

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

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

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

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

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

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