iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >用Java8 stream处理数据
  • 914
分享到

用Java8 stream处理数据

2024-04-02 19:04:59 914人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录1、stream处理数据介绍2、Stream起步3、Stream与Collection比较1、stream处理数据介绍   如果没有集合Collection你如何处理数据?几乎所

1、stream处理数据介绍

  如果没有集合Collection你如何处理数据?几乎所有的Java应用程序都要使用Collection处理数据。他们是十分重要的编程工作:例如,您可能想要创建银行交易的集合Collection,这个集合代表客户的状态。然后,你可能要处理整个集合来找出的顾客花了多少钱。尽管集合如此重要,但是在Java中处理集合的技术还远远不够完善。

首先,对集合的典型处理模式是类似sql操作,比如"finding"(例如,找到具有最高价的交易)或"grouping" (例如,将相关的杂物所有交易合并组) 。大多数数据库让您这样的声明方式指定的操作。例如,下面的SQL查询可以让您找到交易ID最高值: "SELECT id, MAX(value) from transactions" 。

正如你所看到的,我们并不需要实现如何具体计算最大值(例如,使用循环和一个变量来跟踪的最高值) 。我们只能表达我们所期望的要求(获得最大值)。只要我们显式发出这样的查询,数据库就会为我们去处理。可是为什么我们不能在集合Collection中实现类似的东西?多少次,你会发现自己使用循环一遍又一遍的反复遍历集合?(如:for Object o: myLists{ ..})

其次,如何才能有效地处理真正的大数据集合?在理想的情况下,你想利用多核架构加快处理,。然而,编写并行代码很难而且容易出错。

Java 8 api的设计者重新提出了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。此外,数据流可以充分利用多核架构而无需编写多线程的一行代码。这听起来不错,不是吗?

首先,我们看看在Java 7中,如何发现typegrocery 的所有交易,然后返回以交易值降序排序好的交易ID集合?


List<Transaction> groceryTransactions = new Arraylist<>();

for(Transaction t: transactions){

  if(t.getType() == Transaction.GROCERY){

    groceryTransactions.add(t);

  }

}

Collections.sort(groceryTransactions, new Comparator(){

  public int compare(Transaction t1, Transaction t2){

    return t2.getValue().compareTo(t1.getValue());

  }

});

List<Integer> transactionIds = new ArrayList<>();

for(Transaction t: groceryTransactions){

  transactionsIds.add(t.getId());

}

而在Java 8使用Stream:


List<Integer> transactionsIds =

    transactions.stream()

                .filter(t -> t.getType() == Transaction.GROCERY)

                .sorted(comparing(Transaction::getValue).reversed())

                .map(Transaction::getId)

                .collect(toList());

我们首先从交易数据列表中获得一个stream对象,这是通过使用Liststream()方法实现的,下一步几个操作 (filter, sorted, map, collect)是以链式排列成一个管道,形成对数据的查询操作。

那么这段代码如何并行操作呢?那么只要更换transactions.stream()transaction.parallelStream()即可,请注意lambda表达式(t-> t.getCateGory() == Transaction.GROCERY)和方法引用(Transaction::getId)将在下一章详细讲解。

2、Stream起步

首先,定义一下StreamStream是一个来自支持聚合操作源的元素的序列。

如下特点:

  1. 1. 所谓元素的序列,一个Stream向外提供了一个这样的接口:特定元素类型的值的序列,但是Stream并不实际持有也就是存储这些元素,它们是在有需求时才会被计算。
  2. 2. 源:以提供Stream进行计算消费的源,这些源有Collection集合 Array数组或I/O资源等。
  3. 3.聚合操作:Stream支持类似SQL操作和函数式编程的大部分操作,比如:filter, map, reduce, find, match, sorted。

此外,Stream操作不同于Collection操作有两个根本的地方:

  • 1.管道Pipelining: 许多流Stream操作返回流Stream自身,这就允许对其操作可以像链条一样排列,变成一个管道,这其中也会激活比如懒加载和short-circuiting操作。
  • 2.内部迭代:相比于集合Collection是显式迭代(需要我们编码完成迭代),Stream操作是在其内部完成迭代操作。

下面我们看看前面Stream代码的内部工作流程:

我们首先从交易transactions这个列表中获得Stream对象,数据源就是交易列表,其中提供了一系列元素集合,这些元素都是供Stream操作的,下一步,我们使用了一系列对这个Stream的聚合操作,包括过滤filter (用我们指定的谓词条件predicate过滤元素,也就是代码t -> t.getType() == Transaction.GROCERY), 排序(用指定的比较器comparator对元素进行排序), 以及 map (为了释放获取信息). 所有这些操作除了最后的collect操作,都是返回一个Stream对象,这样就能被前后链接在一起变成一个长的管道,可以看成是基于源数据集合的一个查询操作。如同SQL基于数据表的有条件查询语句一样。

最后到collect被调用操作, collect操作开始处理这个管道以返回一个结果,不再是一个结果流了,这里一个结果是List一个对象,我们看到collect接受一个recipe输入函数然后累计Stream中元素到一个汇总结果,这里输入函数是toList(),它是一个将将Stream转换为List对象。

3、Stream与Collection比较

StreamCollection集合有什么区别?Collection是关于静止的数据结构,而Stream是有关动词算法和计算的。前者是主要面向内存,存储在内存中,后者主要是面向CPU,通过CPU实现计算的。

举例将一个影片存储在DVD盘上,这是一个集合,因为它包含整个电影的字节数据结构,而这个影片被放在互联网上,我们通过视频软件去观看它时,它实际是被流化了,它变成了一个字节流,流是与时间有关的概念,而数据结构是与时间无关,不会随着时间变化变化,流正好相反,随着时间不断地动态变化,如同水流一样潺潺不断。

所以,集合与流的主要区别是是否需要被计算,集合是一个内存数据结构,集合中每个元素在加入到集合之前已经被计算了,相反,流是在即时要求即时计算。

使用集合需要开发者主动去遍历,使用一个遍历循环,这称为外部遍历。

而使用一个流库使用内部遍历,它自己为你遍历元素,然后将结果保存在某处,你只要提供一个函数,它就会用这个函数对元素处理完成。内外遍历的区别如下代码:


List<String> transactionIds = new ArrayList<>();

for(Transaction t: transactions){

    transactionIds.add(t.getId()); //外部遍历

}

 

List<Integer> transactionIds =

    transactions.stream()

                .map(Transaction::getId) //内部遍历

                .collect(toList());

到此这篇关于用Java8 stream处理数据的文章就介绍到这了,更多相关 stream处理数据内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 用Java8 stream处理数据

本文链接: https://www.lsjlt.com/news/156438.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 用Java8 stream处理数据
    目录1、stream处理数据介绍2、Stream起步3、Stream与Collection比较1、stream处理数据介绍   如果没有集合Collection你如何处理数据?几乎所...
    99+
    2024-04-02
  • java8 Stream大数据量List分批处理切割方式
    目录java8 Stream大数据量List分批处理java8部分特性及list的常见操作Lambda表达式常见的list操作总结java8 Stream大数据量List分批处理 /...
    99+
    2023-02-15
    java8 Stream 大数据量List处理 大数据分批处理切割
  • 详解java8中的Stream数据流
    Stream是java8引入的一个重度使用lambda表达式的API。Stream使用一种类似用SQL语句从数据库查询数据的直观方式来提供一种对Java集合运算和表达的高阶抽象。直观意味着开发者在写代码时只需关注他们想要的结果是什么而无需关...
    99+
    2023-05-31
    java8 stream 数据流
  • 解析Java8 Stream原理
    目录一、前言二、Stream流水线解决方案2.1、操作如何记录2.2、操作如何叠加2.3、叠加之后的操作如何执行一、前言 首先我们先看一个使用Stream API的示例,具体代码如下...
    99+
    2024-04-02
  • Java8中Stream怎么使用
    今天小编给大家分享一下Java8中Stream怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、概述Java 8 是...
    99+
    2023-07-02
  • Java8中Stream有什么用
    这篇文章主要为大家展示了“Java8中Stream有什么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java8中Stream有什么用”这篇文章吧。Java8对集合提供了一种流式计算的方式,这...
    99+
    2023-06-25
  • 使用Java8 Stream流的skip + limit实现批处理的方法
    为什么需要 Stream Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念。它也不同...
    99+
    2024-04-02
  • Java8 Stream collect(Collectors.toMap())的使用
    目录Collectors.toMap的用法三个重载的方法Java8 stream特性 Collectors.toMapCollectors.toMap的用法 在我们实际开发过程中经常...
    99+
    2024-04-02
  • Stream API 与大数据处理:处理海量数据的利器
    ...
    99+
    2024-04-02
  • Java8中Stream的使用方式
    目录前言:1. 为什么有经验的老手更倾向于使用Stream2. Stream 的使用方式3. Stream 的创建4. Stream 中间操作5. Stream 终止操作6. Str...
    99+
    2024-04-02
  • Java8中的Stream的原理是什么
    本篇内容主要讲解“Java8中的Stream的原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java8中的Stream的原理是什么”吧!Stream的组成与特点Stream(流)是一个...
    99+
    2023-06-15
  • Java 8 Stream 处理数据方法汇总
    目录Stream流Stream流是什么,为什么要用它Stream流的基础使用简单综合案例传统方法Stream流式处理方法获取流根据Collection获取流根据Map获取流根据数组获...
    99+
    2024-04-02
  • Java8 Stream 流常用方法合集
    目录一、概述二、分类三、具体用法1. 流的常用创建方法2. 流的中间操作3. 流的终止操作一、概述 Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行...
    99+
    2024-04-02
  • Java8 Stream流根据多个字段去重
    目录Stream流根据多个字段去重Stream多字段去重,去重求和完整demo如下启动主函数Stream流根据多个字段去重 分组 list.stream().collect(Coll...
    99+
    2024-04-02
  • Java8中stream和functional interface怎么用
    这篇文章主要为大家展示了“Java8中stream和functional interface怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java8中stream和functional i...
    99+
    2023-05-30
    java8 stream functional
  • Java8新特性Stream流怎么使用
    本文小编为大家详细介绍“Java8新特性Stream流怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java8新特性Stream流怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。Stream流的概...
    99+
    2023-07-02
  • Java8处理数据的函数式方式是什么
    本篇内容介绍了“Java8处理数据的函数式方式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!处理数据的函数式方式Java 8 不仅仅添...
    99+
    2023-06-17
  • Java8 Stream流式编程怎么使用
    这篇文章主要介绍了Java8 Stream流式编程怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java8 Stream流式编程怎么使用文章都会有所收获,下面我们一起来看看吧。一、S...
    99+
    2023-07-05
  • Java8中Stream的使用方式是什么
    这篇文章主要介绍“Java8中Stream的使用方式是什么”,在日常操作中,相信很多人在Java8中Stream的使用方式是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java8中Stream的使用方式...
    99+
    2023-06-30
  • Java8中怎么利用Stream实现函数式接口
    这期内容当中小编将会给大家带来有关Java8中怎么利用Stream实现函数式接口,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。函数式接口什么是函数式接口?简单来说就是只有一个抽象函数的接口。为了使得函数式...
    99+
    2023-06-16
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作