返回顶部
首页 > 资讯 > 精选 >Java8中流的特性有哪些
  • 949
分享到

Java8中流的特性有哪些

java8 2023-05-30 21:05:59 949人浏览 泡泡鱼
摘要

这篇文章主要介绍了Java8中流的特性有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。流(Stream)是Java8为了实现最佳性能而引入的一个全新的概念。在过去的几年中

这篇文章主要介绍了Java8中流的特性有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

流(Stream)是Java8为了实现最佳性能而引入的一个全新的概念。在过去的几年中,随着硬件的持续发展,编程方式已经发生了巨大的改变,程序的性能也随着并行处理、实时、云和其他一些编程方法的出现而得到了不断提高。

Java8中,流性能的提升是通过并行化(parallelism)、惰性(Laziness)和短路操作(short-circuit operations)来实现的。但它也有一个缺点,在选择流的时候需要非常小心,因为这可能会降低应用程序的性能。

下面来看看这三项支撑起流强大性能的因素吧。

并行化

流的并行化充分利用了硬件的相关功能。由于现在计算机上通常都有多个CPU核心,所以在多核系统中如果只使用一个线程则会极大地浪费系统资源。设计和编写多线程应用非常具有挑战性,并且很容易出错,因此,流存在两种实现:顺序和并行。使用并行流非常简单,无需专业知识即可轻松处理多线程问题。

在Java的流中,并行化是通过Fork-Join原理来实现的。根据Fork-Join原理,系统会将较大的任务切分成较小的子任务(称之为forking),然后并行处理这些子任务以充分利用所有可用的硬件资源,最后将结果合并起来(称之为Join)组成完整的结果。

在选择顺序和并行的时候,需要非常谨慎,因为并行并一定意味着性能会更好。

让我们来看一个例子。

StreamTest.java:

package test;import java.util.ArrayList;import java.util.List;public class StreamTest { static List < Integer > myList = new ArrayList < > (); public static void main(String[] args) { for (int i = 0; i < 5000000; i++) myList.add(i); int result = 0; long loopStartTime = System.currentTimeMillis(); for (int i: myList) { if (i % 2 == 0) result += i; } long loopEndTime = System.currentTimeMillis(); System.out.println(result); System.out.println("Loop total Time = " + (loopEndTime - loopStartTime)); long streamStartTime = System.currentTimeMillis(); System.out.println(myList.stream().filter(value -> value % 2 == 0).mapToInt(Integer::intValue).sum()); long streamEndTime = System.currentTimeMillis(); System.out.println("Stream total Time = " + (streamEndTime - streamStartTime)); long parallelStreamStartTime = System.currentTimeMillis(); System.out.println(myList.parallelStream().filter(value -> value % 2 == 0).mapToInt(Integer::intValue).sum()); long parallelStreamEndTime = System.currentTimeMillis(); System.out.println("Parallel Stream total Time = " + (parallelStreamEndTime - parallelStreamStartTime)); }}

运行结果:

820084320Loop total Time = 17820084320Stream total Time = 81820084320Parallel Stream total Time = 30

正如你所见,在这种情况下,for循环更好。因此,在没有正确的分析之前,不要用流代替for循环。在这里,我们可以看到,并行流的性能比普通流更好。

注意:结果可能会因为硬件的不同而不同。

惰性

我们知道,Java8的流有两种类型的操作,分别为中间操作(Intermediate)和最终操作(Terminal)。这两种操作分别用于处理和提供最终结果。如果最终操作不与中间操作相关联,则无法执行。

总之,中间操作只是创建另一个流,不会执行任何处理,直到最终操作被调用。一旦最终操作被调用,则开始遍历所有的流,并且相关的函数会逐一应用到流上。中间操作是惰性操作,所以,流支持惰性。

注意:对于并行流,并不会在最后逐个遍历流,而是并行处理流,并且并行度取决于机器CPU核心的个数。

考虑一下这种情况,假设我们有一个只有中间操作的流片段,而最终操作要稍后才会添加到应用中(可能需要也可能不需要,取决于用户的需求)。在这种情况下,流的中间操作将会为最终操作创建另一个流,但不会执行实际的处理。这种机制有助于提高性能。

我们来看一下有关惰性的例子:

StreamLazinessTest.java:

package test;import java.util.ArrayList;import java.util.List;import java.util.stream.Collectors;import java.util.stream.Stream;public class StreamLazinessTest {  static class Employee { int id; String name; public Employee(int id, String name) { this.id = id; this.name = name; } public String getName() { return this.name; } } public static void main(String[] args) throws InterruptedException { List < Employee > employees = new ArrayList < > ();  for (int i = 1; i < 10000000; i++) { employees.add(new StreamLazinessTest.Employee(i, "name_" + i)); }  Stream < String > employeeNameStreams = employees.parallelStream().filter(employee -> employee.id % 2 == 0) .map(employee -> { System.out.println("In Map - " + employee.getName()); return employee.getName(); });  Thread.sleep(2000); System.out.println("2 sec");  employeeNameStreams.collect(Collectors.toList()); }}

运行上面的代码,你可以看到在调用最前操作之前,中间操作不会被执行。

短路行为

这是优化流处理的另一种方法。 一旦条件满足,短路操作将会终止处理过程。 有许多短路操作可供使用。 例如,anyMatch、allMatch、findFirst、findAny、limit等等。

我们来看一个例子。

StreamShortCircuitTest.java:package test;import java.util.ArrayList;import java.util.List;import java.util.stream.Collectors;import java.util.stream.Stream;public class StreamShortCircuitTest {  static class Employee { int id; String name; public Employee(int id, String name) { this.id = id; this.name = name; } public int getId() { return this.id; } public String getName() { return this.name; } } public static void main(String[] args) throws InterruptedException { List < Employee > employees = new ArrayList < > (); for (int i = 1; i < 10000000; i++) { employees.add(new StreamShortCircuitTest.Employee(i, "name_" + i)); }  Stream < String > employeeNameStreams = employees.stream().filter(e -> e.getId() % 2 == 0) .map(employee -> { System.out.println("In Map - " + employee.getName()); return employee.getName(); }); long streamStartTime = System.currentTimeMillis();  employeeNameStreams.limit(100).collect(Collectors.toList()); System.out.println(System.currentTimeMillis() - streamStartTime); }}

运行上面的代码,你会看到性能得到了极大地提升,在我的机器上只需要6毫秒的时间。 在这里,limit()方法在满足条件的时候会中断运行。

最后要注意的是,根据状态的不同有两种类型的中间操作:有状态(Stateful)和无状态(Stateless)中间操作。

有状态中间操作

这些中间操作需要存储状态,因此可能会导致应用程序的性能下降,例如,distinct()、sort()、limit()等等。

无状态中间操作

这些中间操作可以独立处理,因为它们不需要保存状态,例如, filter(),map()等。

在这里,我们了解到,流的出现是为了获得更高的性能,但并不是说使用了流之后性能肯定会得到提升,因此,我们需要谨慎使用。

感谢你能够认真阅读完这篇文章,希望小编分享的“Java8中流的特性有哪些”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网精选频道,更多相关知识等着你来学习!

--结束END--

本文标题: Java8中流的特性有哪些

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

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

猜你喜欢
  • Java8中流的特性有哪些
    这篇文章主要介绍了Java8中流的特性有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。流(Stream)是Java8为了实现最佳性能而引入的一个全新的概念。在过去的几年中...
    99+
    2023-05-30
    java8
  • Java8中Stream的特性有哪些
    这期内容当中小编将会给大家带来有关Java8中Stream的特性有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1.初识stream先来一个总纲:东西就是这么多啦,stream是java8中加入的一个...
    99+
    2023-05-31
    java8 stream ava
  • Java8中日期API的特性有哪些
    这期内容当中小编将会给大家带来有关Java8中日期API的特性有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1.Clock 时钟Clock类提供了访问当前日期和时间的方法,Clock是时区敏感的,可...
    99+
    2023-05-31
    java8 日期api ava
  • java8新特性之stream流中reduce()求和知识有哪些
    这篇文章主要介绍了java8新特性之stream流中reduce()求和知识有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.stream().reduce()单字段求...
    99+
    2023-06-15
  • Java8新特性系列有哪些
    本篇内容介绍了“Java8新特性系列有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在Java 8之前...
    99+
    2024-04-02
  • Java8新特性Optional容器类的应用有哪些
    这篇文章主要讲解了“Java8新特性Optional容器类的应用有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java8新特性Optional容器类的应用有哪些”吧!1.Optiona...
    99+
    2023-06-25
  • Java8新特性Stream流详解
    陈老老老板 说明:新的专栏,本专栏专门讲Java8新特性,把平时遇到的问题与Java8的写法进行总结,需要注意的地方都标红了,一起加油。 本文是介绍Java8新特性Stream流常用方法超详细教学 ...
    99+
    2023-08-17
    java 算法 数据结构
  • Java8新特性Stream流的示例分析
    这篇文章主要介绍Java8新特性Stream流的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!什么是Stream流?Stream流是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。Stream的优点...
    99+
    2023-05-30
    java8 stream流
  • Java8 Stream流的常用方法有哪些
    这篇文章主要介绍“Java8 Stream流的常用方法有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java8 Stream流的常用方法有哪些”文章能帮助大家解决问题。1、...
    99+
    2023-07-02
  • Java8新特性Stream流怎么使用
    本文小编为大家详细介绍“Java8新特性Stream流怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java8新特性Stream流怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。Stream流的概...
    99+
    2023-07-02
  • ES6中有哪些特性
    这篇文章给大家分享的是有关ES6中有哪些特性的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.Object Shorthand新的对象声明方法允许我们可以不声明对象的 key :...
    99+
    2024-04-02
  • HTML5中的新特性有哪些
    这篇文章主要介绍HTML5中的新特性有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 1.HTML5将成为HTML、XHTML以及HTML DOM的新...
    99+
    2024-04-02
  • java中TreeMap的特性有哪些
    这篇文章给大家介绍java中TreeMap的特性有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序。1...
    99+
    2023-06-14
  • MySQL5.7中有哪些新特性
    本篇内容主要讲解“MySQL5.7中有哪些新特性”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL5.7中有哪些新特性”吧!1、介绍 mysql5.7...
    99+
    2024-04-02
  • Redis6.0中新特性有哪些
    小编给大家分享一下Redis6.0中新特性有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Redis 6.0 来了Redis...
    99+
    2024-04-02
  • h5中有哪些新特性
    小编给大家分享一下h5中有哪些新特性,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 1. 新的Doc...
    99+
    2024-04-02
  • h5中history特性有哪些
    这篇文章给大家分享的是有关h5中history特性有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 DOM中的window对象通过window.h...
    99+
    2024-04-02
  • HTML5中有哪些新特性
    这篇文章主要为大家展示了“HTML5中有哪些新特性”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“HTML5中有哪些新特性”这篇文章吧。   当我们进行Web开...
    99+
    2024-04-02
  • PHP7中新特性有哪些
    这篇文章主要为大家展示了“PHP7中新特性有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“PHP7中新特性有哪些”这篇文章吧。类型声明代码:class&nb...
    99+
    2024-04-02
  • JavaScript的特性有哪些
    这篇文章主要讲解了“JavaScript的特性有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript的特性有哪些”吧!ES2015二进制和...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作