Stream01 定义、迭代、操作、惰性求值

1 Stream

  Stream 是 Java 8 提供的一系列对可迭代元素处理的优化方案,使用 Stream 可以大大减少代码量,提高代码的可读性并且使代码更易并行。

2 迭代

  2.1 需求

    随机创建int类型的数组,计算数组中各个元素的总和

  2.2 思路

    2.2.1 外部迭代

      通过for循环迭代数组

    2.2.2 内部迭代

      先将数组转化成流 -> 在通过流的相关操作来实现

    2.2.3 外部迭代和内部迭代

      外部迭代式串行的,如果要实现并行需要自己编写代码实现;内部迭代实现并行操作只需要调用一个parallel()操作即可以啦

  2.3 代码实现

package demo01_iteration;

import org.junit.Before;
import org.junit.Test;

import java.util.Arrays;
import java.util.Random;
import java.util.stream.IntStream;

/**
 * @author 王杨帅
 * @create 2018-06-24 22:48
 * @desc 外部迭代和内部迭代
 **/
public class Case01 {

    private int [] nums;
    private int count = 4;
    private Random random;

    @Before
    public void init() {
        random = new Random();
        nums = new int[count];
        for (int i = 0; i < nums.length; i++) { // 随机产生数组元素
            nums[i] = random.nextInt(30);
        }
    }

    /**
     * 外部迭代:自己利用for训话实现
     */
    @Test
    public void test01() {
        int sum = 0;
        for (int i : nums) {
            sum += i;
        }
        System.out.println(Arrays.toString(nums) + " 各个元素的累加和为:" + sum);
    }

    /**
     * 内部迭代:利用流的相关方法实现
     */
    @Test
    public void test02() {
        int sum = 0;
        sum = IntStream.of(nums).parallel().sum();
        System.out.println(Arrays.toString(nums) + " 各个元素的累加和为:" + sum);
    }

}

3 操作

  3.1 分类

    3.1.1 中间操作

      返回一个Stream流的操作

    3.1.2 终止操作

      返回一个结果的操作

  3.2 代码体验

package demo02_operation;

import org.junit.Before;
import org.junit.Test;

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Random;
import java.util.stream.IntStream;

/**
 * @author 王杨帅
 * @create 2018-06-24 23:04
 * @desc 中间操作、终止操作、惰性求值
 **/
public class Case01 {

    private int [] nums;
    private int count = 5;
    private Random random;

    @Before
    public void init() {
        random = new Random();
        nums = new int[count];
        for (int i = 0; i < nums.length; i++) {
            nums[i] = random.nextInt(30);
        }
    }

    /**
     * 终止操作: 返回一个结果的操作
     */
    @Test
    public void test01() {
        int sum = IntStream.of(nums).sum();
        System.out.println(Arrays.toString(nums) + " 各个元素之和为: " + sum);
    }

    /**
     * 中间操作:返回一个流的操作【例如:Map操作】
     */
    @Test
    public void test02() {
        System.out.println("老的数组为:" + Arrays.toString(nums));
        int [] newNums = IntStream.of(nums).map(s -> s + 2).toArray();
        System.out.println("新的数组为:" + Arrays.toString(newNums));
    }

}

4 惰性求值

  如果流的操作中没有执行终止操作也不会执行中间操作

  4.1 代码体验

package demo02_operation;

import org.junit.Before;
import org.junit.Test;

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Random;
import java.util.stream.IntStream;

/**
 * @author 王杨帅
 * @create 2018-06-24 23:04
 * @desc 中间操作、终止操作、惰性求值
 **/
public class Case01 {

    private int [] nums;
    private int count = 5;
    private Random random;

    @Before
    public void init() {
        random = new Random();
        nums = new int[count];
        for (int i = 0; i < nums.length; i++) {
            nums[i] = random.nextInt(30);
        }
    }

    /**
     * 惰性求值
     */
    @Test
    public void test01() {
        System.out.println("老的数组为:" + Arrays.toString(nums));
//        IntStream.of(nums).map(Case01::addFive); // 没有终止操作,map操作不会执行
        IntStream.of(nums).map(Case01::addFive).sum(); // 有中间操作,map操作会执行
    }

    public static Integer addFive(Integer num) {
        System.out.println("中间操作执行了");
        return num + 5;
    }

}

原文地址:https://www.cnblogs.com/NeverCtrl-C/p/9222265.html

时间: 2024-11-08 02:20:53

Stream01 定义、迭代、操作、惰性求值的相关文章

C#函数式编程之惰性求值

惰性求值 在开始介绍今天要讲的知识之前,我们想要理解严格求值策略和非严格求值策略之间的区别,这样我们才能够深有体会的明白为什么需要利用这个技术.首先需要说明的是C#语言小部分采用了非严格求值策略,大部分还是严格求值策略.首先我们先演示非严格求值策略的情况,我们先在控制台项目中写一个DoOneThing方法. 然后在Main方法中写入下面这串代码: 然后我们运行程序,会发现DoOneThing方法并没有执行.当然这看起来也很正常,因为这是或,并且第一个已经是true了.整个表达式就是true了,自

惰性求值——lodash源码解读

前言 lodash受欢迎的一个原因,是其优异的计算性能.而其性能能有这么突出的表现,很大部分就来源于其使用的算法--惰性求值. 本文将讲述lodash源码中,惰性求值的原理和实现. 一.惰性求值的原理分析 惰性求值(Lazy Evaluation),又译为惰性计算.懒惰求值,也称为传需求调用(call-by-need),是计算机编程中的一个概念,它的目的是要最小化计算机要做的工作. 惰性求值中的参数直到需要时才会进行计算.这种程序实际上是从末尾开始反向执行的.它会判断自己需要返回什么,并继续向后

Swift 之惰性求值

Swift 之惰性求值 在 Haskell 中的函数有一个特性 函数的返回可能是一个块(一个被延迟计算的表达式) 从而引出一个概念 惰性求值 isOdd n = mod n 2 == 1 下面有段 分析 在使用严格求值的语言里,函数的参数总是在应用函数之前被求值.以 isOdd 为例子:子表达式 (1 + 2) 会首先被求值,得出结果 3 .接着,将 3 绑定到变量 n ,应用到函数 isOdd .最后, mod 3 2 返回 1 ,而 1 == 1 返回 True . Haskell 使用了另

利用 Lambda 表达式实现 Java 中的惰性求值

Java 中惰性求值的潜能,完全被忽视了(在语言层面上,它仅被用来实现 短路求值 ).更先进的语言,如 Scala,区分了传值调用与传名调用,或者引入了 lazy 这样的关键字. 尽管 Java 8 通过延迟队列的实现(java.util.stream.Stream)在惰性求值的方面有些改进,但是我们会先跳过 Stream,而把重点放在如何使用 lambda 表达式实现一个轻量级的惰性求值. 基于 lambda 的惰性求值 Scala 当我们想对 Scala 中的方法参数进行惰性求值时,我们用"

python 短路求值或惰性求值

举例说明: 1.关系运算符:and if 表达式1 and 表达式2: ............................. 如果表达式1为False 则不管表达式2是什么 if语句都不会执行接下来的代码 2.关系运算符: or f 表达式1 or 表达式2: ............................. 如果表达式1为True 则不管表达式2是什么 if语句都会执行接下来的代码 原文地址:https://www.cnblogs.com/wfc139/p/10031832.h

hdu6035 Colorful Tree 树形dp 给定一棵树,每个节点有一个颜色值。定义每条路径的值为经过的节点的不同颜色数。求所有路径的值和。

/** 题目:hdu6035 Colorful Tree 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6035 题意:给定一棵树,每个节点有一个颜色值.定义每条路径的值为经过的节点的不同颜色数.求所有路径的值和. 思路:看题解后,才想出来的.树形dp. 求所有路径的值和 = 路径条数*总颜色数(n*(n-1)*colors/2)-sigma(每种颜色没有经过的路径条数) 主要是求每种颜色没有经过的路径条数. 画一棵树,我直接用颜色值表示节点编号. 2

Matrix Chain Multiplication(表达式求值用栈操作)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1082 Matrix Chain Multiplication Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 1382    Accepted Submission(s): 905 Problem Description Matrix mul

编写高质量代码改善C#程序的157个建议[匿名类型、Lambda、延迟求值和主动求值]

原文:编写高质量代码改善C#程序的157个建议[匿名类型.Lambda.延迟求值和主动求值] 前言 从.NET3.0开始,C#开始一直支持一个新特性:匿名类型.匿名类型由var.赋值运算符和一个非空初始值(或以new开头的初始化项)组成.匿名类型有如下基本特性: 1.既支持简单类型也支持复杂类型.简单类型必须是一个非空初始值,复杂类型则是一个以new开头的初始化项. 2.匿名类型的属性是只读的,没有属性设置器,它一旦倍初始化就不可更改. 3.如果两个匿名类型的属性值相同,那么就任务这两个匿名类型

序列点在C语言表达式求值中的作用

摘要: 本文开创性地分析了序列点在C语言表达式求值中的作用:序列点左边的操作数要先于其右边的操作数求值.讨论了逗号操作符,.逻辑与操作符&&.逻辑或操作符||和条件操作符?:的问号处需要序列点的原因.举例分析了序列点在表达式求值中的作用. 关键字:序列点 表达式求值 C语言 C语言作为一种主流程序设计语言,许多编程语言如Java.C++.C#都借鉴了它的语法.C语言也是一种很适当的程序设计入门的教学语言,国内大专院校的许多专业都开设了这门课程并且大多将其作为第一门程序设计语言课程,同时C语