热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

比较Java中的流和循环

比较Java中的流和循环原文:https://www.g

比较 Java 中的流和循环

原文:https://www . geesforgeks . org/comparison-streams-to-loops-in-Java/

流是聚合操作(filter()、map()、forEach()和 collect())的有序管道,这些操作处理(概念上无界的)元素序列。流管道由一个源,后跟零个或多个中间操作组成;和终端操作。聚合操作执行一个功能。理想情况下,函数在流中的输出仅取决于其输入参数。一个流没有非瞬态阶段。每个流的工作原理基本相同,即:


  • 从数据源开始。

  • 通过中间操作管道处理数据。

  • 以终端操作结束。

默认情况下,流中的每个聚合操作都按顺序运行其函数,即在调用方的控制线程中一个接一个地运行。可以从文件的集合、列表、集合、整数、长整型、双精度型、数组、行创建流。

流操作要么是中间的,要么是终端的。过滤、映射或排序等中间操作返回一个流,因此我们可以链接多个中间操作。forEach、collect 或 reduce 等终端操作要么无效,要么返回非流结果。流带来了 Java 中的函数式编程,从 Java 8 开始支持。Java 8 流是 PQSA1 管道和过滤器模式的实现。

示例:

Java 语言(一种计算机语言,尤用于创建网站)


// Java Program to Compare Streams to Loops
// Importing required libraries
import java.io.IOException;
import java.lang.String;
import java.nio.file.*;
import java.util.*;
import java.util.Arrays;
import java.util.List;
import java.util.stream.*;
// Main class
// JavaStreams
class GFG {
    // Main driver method
    public static void main(String[] args)
        throws IOException
    {
        // 1\. Integer Stream
        System.out.println("Integer Stream : ");
        IntStream.range(1, 10).forEach(System.out::print);
        // New line
        System.out.println();
        // 2\. Integer Stream with skip
        System.out.println("Integer Stream with skip : ");
        IntStream.range(1, 10).skip(5).forEach(
            x -> System.out.println(x));
        // New line
        System.out.println();
        // 3\. Integer Stream with sum
        System.out.println("Integer Stream with sum : ");
        System.out.println(IntStream.range(1, 5).sum());
        // New line
        System.out.println();
        // 4\. Stream.of, sorted and findFirst
        System.out.println(
            "Stream.of, sorted and findFirst : ");
        Stream.of("Java ", "Scala ", "Ruby ")
            .sorted()
            .findFirst()
            .ifPresent(System.out::println);
        // New line
        System.out.println();
        // 5\. Stream from Array, sort, filter and print
        String[] names = { "AI",        "Matlab",
                           "Scikit",    "TensorFlow",
                           "OpenCV",    "DeepLearning",
                           "NLP",       "NeuralNetworks",
                           "Regression" };
        System.out.println(
            "Stream from Array, sort, filter and print : ");
        Arrays
            .stream(names) // same as Stream.of(names)
            .filter(x -> x.startsWith("S"))
            .sorted()
            .forEach(System.out::println);
        // New line
        System.out.println();
        // 6\. average of squares of an int array
        System.out.println(
            "Average of squares of an int array : ");
        Arrays.stream(new int[] { 2, 4, 6, 8, 10 })
            .map(x -> x * x)
            .average()
            .ifPresent(System.out::println);
        // New line
        System.out.println();
        // 7\. Stream from List, filter and print
        // Display message only
        System.out.println(
            "Stream from List, filter and print : ");
        List<String> people = Arrays.asList(
            "AI", "Matlab", "Scikit", "TensorFlow",
            "OpenCV", "DeepLearning", "NLP",
            "NeuralNetworks");
        people.stream()
            .map(String::toLowerCase)
            .filter(x -> x.startsWith("a"))
            .forEach(System.out::println);
        // New line
        System.out.println();
        // 8\. Reduction - sum
        // Display message only
        System.out.println("Reduction - sum : ");
        double total
            = Stream.of(7.3, 1.5, 4.8)
                  .reduce(0.0,
                          (Double a, Double b) -> a + b);
        // Print and display
        System.out.println("Total = " + total);
        System.out.println();
        // 9\. Reduction - summary statistics
        System.out.println(
            "Reduction - summary statistics : ");
        IntSummaryStatistics summary
            = IntStream.of(7, 2, 19, 88, 73, 4, 10)
                  .summaryStatistics();
        // Print and display
        System.out.println(summary);
        System.out.println();
    }
}

Output

Integer Stream :
123456789
Integer Stream with skip :
6
7
8
9
Integer Stream with sum :
10
Stream.of, sorted and findFirst :
Java
Stream from Array, sort, filter and print :
Scikit
Average of squares of an int array :
44.0
Stream from List, filter and print :
ai
Reduction - sum :
Total = 13.600000000000001
Reduction - summary statistics :
IntSummaryStatistics{count=7, sum=203, min=2, average=29.000000, max=88}

现在,讨论循环以便找出结论性差异。循环是 Java 中的一个特性,它有助于执行一组指令,直到控制布尔表达式的结果为假。提供不同类型的循环来满足任何编程需求。每个循环都有自己的目的和合适的用例。

示例:

Java 语言(一种计算机语言,尤用于创建网站)


// Java Program to Comparing Streams to Loops
// Importing utility packages
import java.util.*;
// Class 1
// helper class
class ProgrammingLanguage {
    // Member variables of this class
    int rank;
    String name;
    int value;
    // Member method of this class
    public ProgrammingLanguage(int rank, String name,
                               int value)
    {
        // this keyword is used to reger current object
        // itself
        this.rank = rank;
        this.name = name;
        this.value = value;
    }
}
// Class 2
// JavaStreamExample
public class GFG {
    // MAin driver method
    public static void main(String[] args)
    {
        // Creating an object of List class
        // Declaring object of user defined type (above
        // class)
        List<ProgrammingLanguage> programmingLanguage
            = new ArrayList<ProgrammingLanguage>();
        // Adding elements to the object of this class
        // Custom input entries
        programmingLanguage.add(
            new ProgrammingLanguage(1, "Java", 7000));
        programmingLanguage.add(
            new ProgrammingLanguage(2, "Rust", 2000));
        programmingLanguage.add(
            new ProgrammingLanguage(3, "Ruby", 1500));
        programmingLanguage.add(
            new ProgrammingLanguage(4, "Scala", 2500));
        programmingLanguage.add(
            new ProgrammingLanguage(5, "Groovy", 4000));
        // Creating object of List class of integer type
        List<Integer> languageValueList
            = new ArrayList<Integer>();
        // For each loops for iteration
        for (ProgrammingLanguage language :
             programmingLanguage) {
            // Filtering data of List
            if (language.value < 3000) {
                // Adding price to above elements
                languageValueList.add(language.value);
            }
        }
        // Print and display al elements inside the object
        System.out.println(languageValueList);
    }
}

Output

[2000, 1500, 2500]


到目前为止,我们已经理解了这两个概念,并认识到它们并不密切相关,根据使用的场合,一个概念比另一个概念更有优势。因此,通过举例说明以下优点来结束本文:

溪流的优势


  • 流是一种更具声明性的风格。或者更有表现力的风格。

  • 流与函数有很强的相似性。Java 8 引入了 lambdas 和函数接口,这打开了一个强大技术的工具箱。流提供了将函数应用于对象序列的最方便、最自然的方式。

  • 溪流鼓励较少的可变性。这在某种程度上与函数式编程有关,即我们使用流编写的程序往往是不修改对象的程序。

  • 流鼓励更松散的耦合。我们的流处理代码不需要知道流的来源或者它最终的终止方法。

  • 流可以简洁地表达相当复杂的行为。

循环的优势


  • 性能:在堆和 CPU 使用方面,通过数组的 for 循环都非常轻量级。如果原始速度和内存节约是优先考虑的,那么使用流就更糟了。

  • 熟悉度:这个世界充满了经验丰富的程序程序员,来自很多语言背景,对于他们来说循环是熟悉的,流是新奇的。在某些环境中,您希望编写这种人熟悉的代码。

  • 认知开销:由于它的声明性,以及从下面发生的事情中增加的抽象性,你可能需要建立一个新的关于代码如何与执行相关的心智模型。实际上,您只需要在事情出错时,或者需要深入分析性能或细微的 bug 时,才需要这样做。当它“刚刚工作”时,它就刚刚工作。

  • 调试器正在改进,但即使是现在,当我们在调试器中单步执行流代码时,它可能比等效循环更难,因为简单循环非常接近传统调试器使用的变量和代码位置。

结论:

如果你有一个小清单;如果你有一个很大的列表,那么 for 循环会表现得更好;并行流会表现得更好。因为并行流有相当多的开销,所以不建议使用这些,除非您确定值得开销。


推荐阅读
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 简述在某个项目中需要分析PHP代码,分离出对应的函数调用(以及源代码对应的位置)。虽然这使用正则也可以实现,但无论从效率还是代码复杂度方面考虑ÿ ... [详细]
  • 数组的定义用过PHP的同学应该很清楚,无论多么复杂的数据格式都可以用数组来表达,什么类型的数据都可以往里塞,它是工作必备的一部分,使用很简单,易用程度简直变态。在Go语言中就有 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了在实现了System.Collections.Generic.IDictionary接口的泛型字典类中如何使用foreach循环来枚举字典中的键值对。同时还讨论了非泛型字典类和泛型字典类在foreach循环中使用的不同类型,以及使用KeyValuePair类型在foreach循环中枚举泛型字典类的优势。阅读本文可以帮助您更好地理解泛型字典类的使用和性能优化。 ... [详细]
  • 可空类型可空类型主要用于参数类型声明和函数返回值声明。主要的两种形式如下: ... [详细]
author-avatar
k3as0n_701
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有