qt4.8创建.pri

Tagir Valeev关于Stack Overflow的一个有趣问题最近引起了我的注意。 为了简短起见(请阅读问题的详细信息),而以下代码则有效:

public static Stream<Long> longs() {return Stream.iterate(1L, i ->1L + longs().skip(i - 1L).findFirst().get());
}longs().limit(5).forEach(System.out::println);

印刷

1
2
3
4
5

以下类似代码将不起作用:

public static LongStream longs() {return LongStream.iterate(1L, i ->1L + longs().skip(i - 1L).findFirst().getAsLong());
}

导致StackOverflowError

当然,这种递归迭代不是最佳的。 它不是Java 8之前的版本,当然也没有新的API。 但是有人可能认为它至少应该起作用,对吗? 之所以不起作用,是因为Java 8中的两个iterate()方法之间的细微实现差异。虽然引用类型流的Iterator首先返回seed ,然后才通过对前一个应用迭代函数来进行迭代。值:

final Iterator<T> iterator = new Iterator<T>() {@SuppressWarnings("unchecked")T t = (T) Streams.NONE;@Overridepublic boolean hasNext() {return true;}@Overridepublic T next() {return t = (t == Streams.NONE) ? seed : f.apply(t);}
};

LongStream.iterate()版本(和其他原始流)不是这种情况:

final PrimitiveIterator.OfLong iterator = new PrimitiveIterator.OfLong() {long t = seed;@Overridepublic boolean hasNext() {return true;}@Overridepublic long nextLong() {long v = t;t = f.applyAsLong(t);return v;}
};

迭代功能已经预先预取一个值。 这通常不是问题,但可能导致

  1. 迭代函数昂贵时的优化问题
  2. 递归使用迭代器时的无限递归

作为一种解决方法,最好避免在原始类型流中使用此方法简单地进行递归。 幸运的是,JDK 9中的修复已在进行中(作为功能增强的副作用): https : //bugs.openjdk.java.net/browse/JDK-8072727

翻译自: https://www.javacodegeeks.com/2016/03/watch-recursion-java-8s-primitivestream-iterate.html

qt4.8创建.pri

qt4.8创建.pri_注意Java 8的[Pri​​mitive] Stream.iterate()中的递归相关推荐

  1. 注意Java 8的[Pri​​mitive] Stream.iterate()中的递归

    Tagir Valeev关于Stack Overflow的一个有趣问题最近引起了我的注意. 为了简短起见(请阅读问题的详细信息),而以下代码则有效: public static Stream<L ...

  2. java peek函数_Java 8 Stream Api 中的 peek 操作

    1. 前言 我在 Java 8 Stream API中的 map 和flatMap 中讲述了Java8 Stream API中 map 操作和 flatMap 操作的区别.然后有小伙伴告诉我 peek ...

  3. java.util.stream_java.util.stream.Stream 接口中的常用方法

    流模型的操作很丰富,下面介绍一些常用的API.这些方法可以被分成两种: 延迟方法 返回值类型仍然是 Stream 接口自身类型的方法,因此支持链式调用.(除了终结方法外,其余方 法均为延迟方法.) 终 ...

  4. sybase asa转mysql_为Sybase ASA创建外部存储过程(Java示例)

    下面介绍一个简单的示例,来创建一个基于Java 的ASA存储过程, 数据库(ASA11.0或以上版本), 该示例很简单,输入主机名,返回对应的 衡量一个DBMS的功能是否强大,外部存储过程是否很方便创 ...

  5. Maven-学习笔记05【基础-使用骨架创建Maven的Java工程】

    Java后端 学习路线 笔记汇总表[黑马程序员] 黑马程序员(腾讯微云)Maven基础讲义.pdf Maven-学习笔记01[基础-Maven基本概念] Maven-学习笔记02[基础-Maven的安 ...

  6. java创建数组大小为n_如何通过提供大小在Kotlin中创建一个像Java一样的数组?

    根据 reference,数组按以下方式创建: >对于Java的原始类型,存在不同的类型IntArray,DoubleArray等,它们存储unboxed值. 它们是使用相应的构造函数和工厂函数 ...

  7. java 创建string对象机制 字符串缓冲池 字符串拼接机制 字符串中intern()方法...

    字符串常量池:字符串常量池在方法区中 为了优化空间,为了减少在JVM中创建的字符串的数量,字符串类维护了一个字符串池,每当代码创建字符串常量时,JVM会首先检查字符串常量池.如果字符串已经存在池中,就 ...

  8. dbeaver连接mysql 驱动jar_用Intellij Idea创建一个普通的Java工程并用JDBC连接数据库...

    演示:如何创建一个普通的Java工程,并导入MySql数据库的驱动包,用JDBC方式来连接数据库. Intellj Idea 先创建工程 1.打开Intellij Idea,创建Project,Fil ...

  9. 创建自己的Java批注

    如果您一直在用Java编程并且使用诸如Spring和Hibernate之类的任何流行框架,那么您应该对使用注释非常熟悉. 当使用现有框架时,其注释通常就足够了. 但是,您是否发现需要创建自己的注释? ...

最新文章

  1. csvtk:高效命令行版极简dplyr
  2. 数据库中INFORMATION_SCHEMA的说明及使用
  3. Tomcat服务器的常用配置
  4. 【Linux 内核 内存管理】优化内存屏障 ③ ( 编译器屏障 | 禁止 / 开启内核抢占 与 方法保护临界区 | preempt_disable 禁止内核抢占源码 | 开启内核抢占源码 )
  5. TOMCAT websocket 多连接内存泄漏与jetty对比分析
  6. JavaSE面向对象学习笔记总结
  7. kaili camera
  8. Android中DisplayMetrics 获取手机屏幕分辨率
  9. 北京金融局、通州区政府与蚂蚁金服战略合作 共防系统性金融风
  10. mongoexport导出mongodb数据库中的数据
  11. Java LocalDateTime
  12. RESTful Web Services简单介绍
  13. OpenCV学习:OpenCV文件一览
  14. Java中做比较介绍
  15. MultipartFile多文件上传
  16. 快速调用企业工商数据
  17. 二次函数顶点式计算机,二次函数公式:顶点式、交点式、两根式
  18. tensorflow XLA 笔记
  19. 流畅的python第二章, 列表和元组和数组
  20. mongodb-更新操作符

热门文章

  1. P5305-[GXOI/GZOI2019]旧词【树链剖分,线段树】
  2. P2611-[ZJOI2012]小蓝的好友【Treap,扫描线】
  3. P5445-[APIO2019]路灯【set,树状数组套线段树】
  4. jzoj3086,luogu3831-[SHOI2012]回家的路【最短路,拆点】
  5. P2672-推销员【贪心】
  6. Codeforces Round #497 (Div. 1)
  7. 动态规划训练23 [Making the Grade POJ - 3666 ]
  8. SpringBoot2.1.9 多MongoDB配置
  9. 训练集样本不平衡问题对CNN的影响
  10. Oracle入门(二)之服务启动bat