基于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啊?”,你就可以把本文中的方法告诉他了。

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

(0)

相关推荐

  • 解析Java的Jackson库中Streaming API的使用

    流式API读取和写入JSON内容离散事件. JsonParser读取数据,而JsonGenerator写入数据.它是三者中最有效的方法,是最低开销和最快的读/写操作.它类似于XML的Stax解析器. 在本文中,我们将展示的使用Jackson的流式API 读写JSON数据.流式API工作使用JSON为每一个细节的都是要小心处理.下面的例子将使用两个类: JsonGenerator类--写入JSON字符串. sonGenerator是定义公共API编写的Json内容的基类.使用JsonFactory

  • Java 8 Stream Api 中的 map和 flatMap 操作方法

    1.前言 Java 8提供了非常好用的 Stream API ,可以很方便的操作集合.今天我们来探讨两个 Stream中间操作 map(Function<? super T, ? extends R> mapper) 和 flatMap(Function<? super T, ? extends Stream<? extends R>> mapper) 2. map 操作 map 操作是将流中的元素进行再次加工形成一个新流.这在开发中很有用.比如我们有一个学生集合,我们

  • Java 8中Stream API的这些奇技淫巧!你Get了吗?

    上次老师跟大家分享了 cookie.session和token,今天给大家分享一下Java 8中的Stream API. Stream简介 1.Java 8引入了全新的Stream API.这里的Stream和I/O流不同,它更像具有Iterable的集合类,但行为和集合类又有所不同. 2.stream是对集合对象功能的增强,它专注于对集合对象进行各种非常便利.高效的聚合操作,或者大批量数据操作. 3.只要给出需要对其包含的元素执行什么操作,比如 "过滤掉长度大于 10 的字符串".&

  • 如何利用Java8 Stream API对Map按键或值排序

    一.什么是Java 8 Stream 使用Java 8 Streams,我们可以按键和按值对映射进行排序.下面是它的工作原理: Java Stream函数式编程?用过都说好,案例图文详解送给你 将Map或List等集合类对象转换为Stream对象 使用Streams的sorted()方法对其进行排序 最终将其返回为LinkedHashMap(可以保留排序顺序) sorted()方法以Comparator作为参数,从而可以按任何类型的值对Map进行排序.如果对Comparator不熟悉,可以看本号

  • Java8中Lambda表达式使用和Stream API详解

    前言 Java8 的新特性:Lambda表达式.强大的 Stream API.全新时间日期 API.ConcurrentHashMap.MetaSpace.总得来说,Java8 的新特性使 Java 的运行速度更快.代码更少.便于并行.最大化减少空指针异常. 0x00. 前置数据 private List<People> peoples = null; @BeforeEach void before () { peoples = new ArrayList<>(); peoples

  • java8使用Stream API方法总结

    Stream是java8中处理集合的关键抽象概念,它可以指定您希望对集合进行的操作,可以执行非常复杂的查找.过滤和映射数据等操作.使用Stream API对集合数据进行操作,就类似于使用SQL执行的数据库查询. Stream 的三个操作步骤 1.创建Stream. 得到Stream流的第一种方式: 可以通过Collection系列集合提供提供的Stream()或parallelStream @Test public void test1() { //可以通过Collection系列集合提供提供的

  • Java中使用StackWalker和Stream API进行堆栈遍历

    1.Java 9以前堆栈遍历 到目前为止,官方解决方案是获取当前线程并调用其getStackTrace()方法: StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); 另一个智能解决方案涉及.抛出异常并从中提取堆栈跟踪信息. 但是,无法操纵结果,它会立即打印出来: new Exception().printStackTrace(); 两种解决方案都存在同样的问题--它们都急切地捕获整个堆栈

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

    目标&背景 我们以"处理订单数据"为例,假设我们的应用是一个分布式应用,有"订单应用","物流应用","商品应用"等都是独立的服务.本次我们的目的需要展示订单列表完整数据: 1.查询订单列表. 2.批量查询物流信息. 3.将物流信息填充到订单主信息中. 假设我们定义了一个订单类,具有几个关键的属性:订单号,状态,订单价,快递信息.如下所示: class Order{ String orderSeq; String st

  • Java8 Stream API 详细使用方法与操作技巧指南

    本文实例讲述了Java8 Stream API 详细使用方法与操作技巧.分享给大家供大家参考,具体如下: 1. 概述 Java 8 引入的一个重要的特性无疑是 Stream API.Stream 翻译过来是"流",突然想到的是大数据处理有个流式计算的概念,数据通过管道经过一个个处理器(Handler)进行筛选,聚合,而且流都具有向量性,强调的是对数据的计算处理,而集合强调的是数据集.Stream可以看做是一个可操作的数据集序列,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找.

  • java8 Stream API之reduce使用说明

    本篇我们只讲reduce. reduce的作用是把stream中的元素给组合起来. 至于怎么组合起来:它需要我们首先提供一个起始种子,然后依照某种运算规则使其与stream的第一个元素发生关系产生一个新的种子,这个新的种子再紧接着与stream的第二个元素发生关系产生又一个新的种子,就这样依次递归执行,最后产生的结果就是reduce的最终产出,这就是reduce的算法最通俗的描述: 那么结合实际的业务场景来说,运用reduce我们可以做sum,min,max,average,所以这些我们称之为针

  • 深入理解Java8新特性之Stream API的终止操作步骤

    目录 1.写在前面 2.终止操作 2.1 终止操作之查找与匹配 2.2 终止操作之归约与收集 1.写在前面 承接了上一篇文章(说完了Stream API的创建方式及中间操作):深入理解Java8新特性之Stream API的创建方式和中间操作步骤. 我们都知道Stream API完成的操作是需要三步的:创建Stream → 中间操作 → 终止操作.那么这篇文章就来说一下终止操作. 2.终止操作 终端操作会从流的流水线生成结果.其结果可以是任何不是流的值,例如:List.Integer,甚至是 v

  • 熟练掌握Java8新特性之Stream API的全面应用

    1.写在前面 关于Stream API的内容,已经基本上说完了.大家可以参考我的这两篇文章: 深入理解Java8新特性之Stream API的创建方式和中间操作步骤.深入理解Java8新特性之Stream API的终止操作步骤 那么这篇文章主要就是说一个Stream API的简单应用练习题. 2.应用举例 首先,我们需要创建一个交易员类.交易类.存储这两个类对象的List集合. package com.szh.java8.exer; import lombok.AllArgsConstructo

  • java8 Stream流逐行处理文本文件

    本文中为大家介绍使用java8 Stream API逐行读取文件,以及根据某些条件过滤文件内容 1. Java 8逐行读取文件 在此示例中,我将按行读取文件内容并在控制台打印输出. Path filePath = Paths.get("c:/temp", "data.txt"); //try-with-resources语法,不用手动的编码关闭流 try (Stream<String> lines = Files.lines( filePath )) {

  • 用Java8 stream处理数据

    目录 1.stream处理数据介绍 2.Stream起步 3.Stream与Collection比较 1.stream处理数据介绍 如果没有集合Collection你如何处理数据?几乎所有的Java应用程序都要使用Collection处理数据.他们是十分重要的编程工作:例如,您可能想要创建银行交易的集合Collection,这个集合代表客户的状态.然后,你可能要处理整个集合来找出的顾客花了多少钱.尽管集合如此重要,但是在Java中处理集合的技术还远远不够完善. 首先,对集合的典型处理模式是类似S

随机推荐