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

上一篇中我们通过一个实例看到了Java8 Stream API 相较于传统的的Java 集合操作的简洁与优势,本篇我们依然借助于一个实际的例子来看看Java8 Stream API 如何抽取及收集数据。
备注:上一篇内容:如何用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::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 还有分组 等功能,后面再说。你也可以关注我的公众号,第一时间收到推送。

原文地址:https://www.cnblogs.com/demingblog/p/12399043.html

时间: 2024-08-30 06:28:35

何用Java8 Stream API进行数据抽取与收集的相关文章

Java8 Stream API

Stream是Java8中,操作集合的一个重要特性. 从iteration到Stream操作 当你操作一个集合的时候,你通常的做法是迭代每一个元素,然后处理你想要的事情.举个例子: String contents = new String(Files.readAllBytes( Paths.get("alice.txt")), StandardCharsets.UTF_8); // 读取文件到字符串中 List<String> words = Arrays.asList(c

使用Java8 Stream API对Map按键或值进行排序

一.什么是Java 8 Stream 使用Java 8 Streams,我们可以按键和按值对映射进行排序.下面是它的工作原理: 将Map或List等集合类对象转换为Stream对象 使用Streams的sorted()方法对其进行排序 最终将其返回为LinkedHashMap(可以保留排序顺序) sorted()方法以Comparator作为参数,从而可以按任何类型的值对Map进行排序.如果对Comparator不熟悉,可以看本号前几天的文章,有一篇文章专门介绍了使用Comparator对Lis

JAVA8新特性之 Stream API

重要的 Stream API  : java.util.Stream.* Stream提供了一种高效且简易处理数据的方式 注意:1.Stream自己不会存储元素 2.对Stream进行操作不会改变数据源,相反,会产生一个执有结果的新Stream 3.Stream操作是延迟执行的.只有进行了终止操作才会产生结果 (并行流就是把内容分成多个数据块,并用不同的线程分别处理每个数据块.在Java8 后,Stream API可以声明性的通过parallel()与sequential()在并行流与串行流(顺

java8(2)--- Stream API

1.简述 Java8中有两大最为重要的改变.第一个是 Lambda 表达式:另外一 个就是 Stream API. Stream 是处理集合的抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找.过滤和映射数据等操作.使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询,比如可以实现group by的分组操作.总之就是Stream API提供的高效简介的数据处理方式. 流(Stream)是什么?心脏的血液通过血管流变全身,在血管中的时候就可以看做流,

Java8新特性Stream API与Lambda表达式详解(1)

1 为什么需要Stream与Lambda表达式? 1.1  为什么需要Stream Stream作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念.它也不同于 StAX 对 XML 解析的 Stream,也不是 Amazon Kinesis 对大数据实时处理的 Stream.Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利.高效的聚合操作(aggr

【百度地图API】交你如何用百度地图搜索自己的数据!不需数据库!

原文:[百度地图API]交你如何用百度地图搜索自己的数据!不需数据库! 摘要: 我有一定的房产数据,还有银行数据.我想在百度地图上标注出来,并且能搜索到我这些数据. 可是百度的数据库上并没有我的数据.我应该怎么办呢? ------------------------------------------------------------------------------------------ 一.无需数据库,如何建立自己的地理信息表. 如果让初学者去建立数据库,那么意味着大家还要学习数据库,

如何用 Python 和 API 收集与分析网络数据?

摘自 https://www.jianshu.com/p/d52020f0c247 本文以一款阿里云市场历史天气查询产品为例,为你逐步介绍如何用 Python 调用 API 收集.分析与可视化数据.希望你举一反三,轻松应对今后的 API 数据收集与分析任务. 市场 我们尝试的,是他们找到的阿里云市场的一款 API 产品,提供天气数据. 它来自于易源数据,链接在 https://market.aliyun.com/products/57096001/cmapi010812.html?spm=517

java8新特性(Stream API)

Stream API的操作步骤: 1.创建Stream 2.中间操作 3.终止操作(终端操作) //1. 创建 Stream @Test public void test1(){ //1. Collection 提供了两个方法 stream() 与 parallelStream() List<String> list = new ArrayList<>(); Stream<String> stream = list.stream(); //获取一个顺序流 Stream&

数据抽取工具——DMCTextFilter V4.2(纯文本抽出通用程序库)

DMCTextFilter V4.2是由北京红樱枫软件有限公司研制和开发的纯文本抽出通用程序库产品.本产品可以从各种各样的文档格式的数据中或从插入的OLE对象中,完全除掉特殊控制信息,快速抽出纯文本数据信息.便于用户实现对多种文档数据资源信息进行统一管理,编辑,检索和浏览.本产品采用了先进的多语言.多平台.多线程的设计理念,支持多国语言(英语,中文简体,中文繁体,日本语,韩国语),多种操作系统(Windows,Solaris,Linux,IBM AIX,Macintosh,HP-UNIX),多种