问题标签 [java-stream]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 集合以流式传输到新集合
我正在寻找最轻松的方式来过滤集合。我在想类似的东西
但我不确定如何最好地从过滤器返回或填充另一个集合。大多数示例似乎就像“在这里您可以打印”。可能有我缺少的构造函数或输出方法。
java - 递归流
我想使用 Java 8 递归地列出我计算机上的所有文件。
Java 8 提供了listFiles
一种返回所有文件和目录但没有递归的方法。如何使用它来获取文件的完整递归列表(不使用变异集合)?
我已经尝试了下面的代码,但它只深入了一层:
并且 usingreturn Files.list(p).flatMap(listFiles);
不编译(不知道为什么)......
注意:我对涉及 FileVisitor 或外部库的解决方案不感兴趣。
java - 提供流生成的限制条件
我正在编写一个代码来计算斐波那契数。使用此代码,我可以生成斐波那契数列的前 n 个数字。
该方法limit
返回Stream
保存传递给此方法的元素数。我想Stream
在斐波那契数达到某个值后停止生成。
我的意思是,如果我想列出所有小于 1000 的斐波那契数,那么我不能使用limit
,因为我不知道可能有多少斐波那契数。
有没有办法使用 lambda 表达式来做到这一点?
java - 终端操作(例如 forEach)可以重新抛出已检查的异常吗?
我有一个删除一些文件的方法:
try/catch 块降低了操作的可读性,尤其是与使用方法引用相比:
不幸的是,该代码无法编译。
有没有办法应用在终端操作中引发检查异常并简单地“重新引发”任何异常的操作?
我知道我可以编写一个包装器,将检查的异常转换为未经检查的异常,但如果可能的话,我宁愿坚持使用 JDK 中的方法。
java - 从地图中获取最高 n 个数字的最简洁方法?
我已经有以下内容:
这导致从枚举到“出现次数”的映射,因此EUR
可以映射到10
和。可能,计数可能相同。USD
1
现在我有没有尽可能简洁并有能力使用java-8
,得到InvoiceCurrency
属于最高数字的那个?有没有一种简洁的方法来查看排序整数计数的前 2 个实际上具有相同的值?
我知道我可以用循环等方式对其进行编程,但我希望依靠这种java-8
精神来编写最可维护的代码。
java - Java 8 流 int 和 Integer
刚刚用 Java 8 弄脏了我的手,偶然发现了如下行为 -
输出是:
而我期望代码在这两种情况下都打印所有 int 和 Integer?对此的任何见解都会非常有帮助......
java - 如何将 FibSupplier 变成通用的 FiniteSupplier?
考虑到我有以下课程:
如果你看一下FibSupplier
你会发现它暴露了一个普遍的问题,即使它在这里有一个专门的实现,我设法提取的是:
- 它有一个
Predicate
. - 它具有初始变量。
- 它有一个需要由谓词测试的变量。
- 它有一个自定义
next()
方法。
我尝试通过以下方式来概括这一点,请注意,我现在使用通用版本而不是专用整数版本:
我希望能够FiniteSupplier
用 a调用predicate
,但是现在我真的不知道如何实现我设法提取的其他要求。我知道可以通过扩展FiniteSupplier
和使其抽象来完成,但这是正确的方法吗?
java - 如何创建无限流出一个迭代器?
看看我所做的以下课程:
以及它的用法:
我怎样才能创造无限 Stream<E>
?
如果我要使用Stream<Integer> infiniteStream = toList(FibonacciSupplier.infinite()).stream()
,我可能会令人惊讶地永远不会获得无限流。相反,代码将在底层方法
的创建中永远循环。list
到目前为止,这纯粹是理论上的,但如果我想首先跳过无限流中的前 x 个数字,然后将其限制为最后 y 个数字,我可以肯定地理解它的必要性,例如:
代码永远不会返回结果,应该怎么做?
java - 具有流和性能的 Java 8 嵌套循环
为了练习 Java 8 流,我尝试将以下嵌套循环转换为 Java 8 流 API。它计算 a^b (a,b < 100) 的最大数字总和,并在我的 Core i5 760 上花费约 0.135 秒。
我的解决方案,由于并行性,我预计会更快,实际上需要 0.25 秒(没有 0.19 秒parallel()
):
我的问题
- 我做了正确的转换还是有更好的方法将嵌套循环转换为流计算?
- 为什么流变体比旧变体慢得多?
- 为什么parallel()语句实际上将时间从0.19s增加到0.25s?
我知道微基准是脆弱的,并行性只对大问题值得,但对于 CPU,即使是 0.1 秒也是永恒的,对吧?
更新
我使用 Eclipse Kepler 中的 Junit 4 框架进行测量(它显示了执行测试所花费的时间)。
我的 a,b<1000 而不是 100 的结果:
- 传统循环 186s
- 顺序流 193s
- 并行流 55s
更新 2
替换sum+=Integer.valueOf(c+"");
为sum+= c - '0';
(感谢彼得!)将并行方法缩短了 10 秒,使其达到 45 秒。没想到性能影响这么大!
此外,将并行度减少到 CPU 内核的数量(在我的情况下为 4 个)并没有起到太大作用,因为它只将时间减少到 44.8 秒(是的,它增加了 a 和 b=0,但我认为这不会影响性能很多):
java - 转换列表到地图计算发生次数
我正在玩 Java 8,我知道这必须通过阅读文档来实现,我只是不知道该怎么做。
我有以下工作代码:
重要的部分是我有一个List<Long>
可能在某些数字上有重复的Long
数字。
现在我想将它转换为一个Map<Long, Long>
作为键的元素和作为值的出现。
我以为:
会工作,但它不会。我在 java.util.stream.Collectors 文档中查找了示例。
我需要如何使用这些功能?