首页 > 其他分享 >jdk1.8中lambda表达式的理解

jdk1.8中lambda表达式的理解

时间:2023-04-10 11:55:18浏览次数:54  
标签:状态 jdk1.8 stream System println 操作 out 表达式 lambda

惰性求值

String msg = "打印一些日志:" + this
logger.fine(msg);

// 即使最后不打印日志,但字符串的拼接工作还是会执行
logger.fine(() -> "打印一些日志:" + this);

// 使用了lambda表达式之后,字符串的拼接放到一个函数里面,fine日志需要打印的时候才去调用这个方法才真正执行!

 

 

 

stream流编程

  stream流中也使用惰性求值(外部迭代关注怎么做、内部迭代关注做什么);

import java.util.stream.IntStream;

public class StreamDemo1 {

  public static void main(String[] args) {
    int[] nums = { 1, 2, 3 };
    // 外部迭代
    int sum = 0;
    for (int i : nums) {
      sum += i;
    }
    System.out.println("结果为:" + sum);

    // 使用stream的内部迭代
    // map就是中间操作(返回stream的操作)
    // sum就是终止操作
    int sum2 = IntStream.of(nums).map(StreamDemo1::doubleNum).sum();
    System.out.println("结果为:" + sum2);

    System.out.println("惰性求值就是终止没有调用的情况下,中间操作不会执行");
    IntStream.of(nums).map(StreamDemo1::doubleNum);
  }

  public static int doubleNum(int i) {
    System.out.println("执行了乘以2");
    return i * 2;
  }
}

  操作类型分类

    首先分为中间操作和最终操作;在最终操作没有调用的情况下,所有的中级操作都不会执行;

    一般来说:返回stream流的就是中间操作,可以继续链式调用下去;不是返回stream流的就是最终操作;

    

    最终操作里面又分为短路操作和非短路操作;短路操作例如limit/findxxx/xxxMatch这种,就是为了找到符合条件的就终止,其他的就是非短路操作;

    

    中间操作也分为有状态操作和无状态操作;状态就是和其他数据有关系;

    如果方法只有一个参数,那就是无状态操作,否则就是有状态操作;

    在多个操作的时候,我们需要把无状态操作写在一起,有状态操作放到最后,这样效率会更加高;

package stream;

import java.util.Random;
import java.util.concurrent.TimeUnit;
import java.util.stream.Stream;

/**
 * 验证stream运行机制
 * 
 * 1. 所有操作是链式调用, 一个元素只迭代一次 
 * 2. 每一个中间操作返回一个新的流. 流里面有一个属性sourceStage 
 *     指向同一个 地方,就是Head 
 * 3. Head->nextStage->nextStage->... -> null
 * 4. 有状态操作会把无状态操作阶段,单独处理
 * 5. 并行环境下, 有状态的中间操作不一定能并行操作.
 * 
 * 6. parallel/ sequetial 这2个操作也是中间操作(也是返回stream)
 *     但是他们不创建流, 他们只修改 Head的并行标志
 *
 */
public class RunStream {

  public static void main(String[] args) {
    Random random = new Random();
    // 随机产生数据
    Stream<Integer> stream = Stream.generate(() -> random.nextInt())
        // 产生500个 ( 无限流需要短路操作. )
        .limit(500)
        // 第1个无状态操作
        .peek(s -> print("peek: " + s))
        // 第2个无状态操作
        .filter(s -> {
          print("filter: " + s);
          return s > 1000000;
        })
        // 有状态操作
        .sorted((i1, i2) -> {
          print("排序: " + i1 + ", " + i2);
          return i1.compareTo(i2);
        })
        // 又一个无状态操作
        .peek(s -> {
          print("peek2: " + s);
        }).parallel();

    // 终止操作
    stream.count();
  }

  /**
   * 打印日志并sleep 5 毫秒
   * 
   * @param s
   */
  public static void print(String s) {
    // System.out.println(s);
    // 带线程名(测试并行情况)
    System.out.println(Thread.currentThread().getName() + " > " + s);
    try {
      TimeUnit.MILLISECONDS.sleep(5);
    } catch (InterruptedException e) {
    }
  }
}

 

参考链接

【1】http://www.imooc.com/article/27181

标签:状态,jdk1.8,stream,System,println,操作,out,表达式,lambda
From: https://www.cnblogs.com/ReturnOfTheKing/p/17302283.html

相关文章

  • Java: switch lambda-like syntax
     Theswitchexpressionhasanadditionallambda-likesyntaxanditcanbeusednotonlyasastatement,butalsoasanexpressionthatevaluatestoasinglevalue. Withthenewlambda-likesyntax,ifalabelismatched,thenonlytheexpressionorstat......
  • Python正则表达式
    本章将介绍Python中正则表达式,本文将会基于Python的标准库re模块讲解正则表达式。1、正则表达式的基本使用1.1、re.search(正则表达式,待匹配文本)我们可以使用re.search查询待匹配文本中是否存在可以匹配上的字符串,直接上例子。importrematch=re.search(r'pytho......
  • 简化你的代码,提高生产力:这10个Lambda表达式必须掌握
    前言&emsp;&emsp;Lambda表达式是一种在现代编程语言中越来越常见的特性,可以简化代码、提高生产力。这篇文章将介绍10个必须掌握的Lambda表达式,这些表达式涵盖了在实际编程中经常用到的常见场景,例如列表操作、函数组合、条件筛选等。通过学习这些Lambda表达式,你将更加深入地理解函数......
  • 剑指 Offer 19. 正则表达式匹配
    题目链接:剑指Offer19.正则表达式匹配方法:动态规划解题思路详情见:逐行详细讲解,由浅入深,dp和递归两种思路代码classSolution{public:boolisMatch(strings,stringp){intn=s.size(),m=p.size();boolf[n+1][m+1];//f[i][j]代表s......
  • JavaScript 中使用正则表达式的方法
    目录使用方法常见的使用方法test()exec()match()replace()split()使用方法在JavaScript中,正则表达式可以用字面量语法创建。字面量语法是一种非常简单直观的表示正则表达式的方式。它使用两个斜杠(/)括起来,如下所示:constregex=/pattern/;例如,要匹配字母a和b之间的所有字......
  • C++primer第四章表达式
    4.1 基础4.1.1 基本概念当一个对象作为右值时,用的是对象的值。当一个对象作为左值时,用的是对象的身份(在内存中的位置)。如果表达式的求值结果是左值,decltype作用于该表达式得到一个引用类型。4.1.2 优先级与结合律括号优先级比较高。在第四章结尾处附上了......
  • 判断字符串是不是正则表达式
    :rules="[{required:true,trigger:'blur',validator:this.checkCanonical},]"checkCanonical(rule,value,callback){if(value){letisReg=truetry{isReg=eval(......
  • java -- Math、BigInteger、BigDecimal类和基本类型的包装类、正则表达式
    Mathjava.lang.Math类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。类似这样的工具类,其所有方法均为静态方法,并且不会创建对象,调用起来非常简单。Math.PI//静态常量publicstaticfinaldoublePI=3.14159265358979323846;abs//返回参数的绝对......
  • Java 判断是否是数字 正则表达式
    privatestaticbooleanisInteger(Stringstr){//可以包含小数Patternpattern=Pattern.compile("^[0-9]+(.[0-9]+)?$");//只包含两位小数Patternpattern=Pattern.compile("^(([1-9]{1}\\d*)|([0]{1}))(\\.(\\d){0,2})?$");......
  • Cenos7 安装 jdk1.8
    一、方式一yun安装JDK1.查看云端支持安装的jdk版本yumsearchjava|grepjdk2.安装jdkyuminstall-yjava-1.8.0-openjdk3.查看jdk版本,验证是否安装成功java-version4.查看jdk默认安装目录find/-name'java' ......