问题标签 [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.

0 投票
4 回答
79965 浏览

java - 集合以流式传输到新集合

我正在寻找最轻松的方式来过滤集合。我在想类似的东西

但我不确定如何最好地从过滤器返回或填充另一个集合。大多数示例似乎就像“在这里您可以打印”。可能有我缺少的构造函数或输出方法。

0 投票
2 回答
8932 浏览

java - 递归流

我想使用 Java 8 递归地列出我计算机上的所有文件。

Java 8 提供了listFiles一种返回所有文件和目录但没有递归的方法。如何使用它来获取文件的完整递归列表(不使用变异集合)?

我已经尝试了下面的代码,但它只深入了一层:

并且 usingreturn Files.list(p).flatMap(listFiles);不编译(不知道为什么)......

注意:我对涉及 FileVisitor 或外部库的解决方案不感兴趣。

0 投票
4 回答
4632 浏览

java - 提供流生成的限制条件

我正在编写一个代码来计算斐波那契数。使用此代码,我可以生成斐波那契数列的前 n 个数字。

该方法limit返回Stream保存传递给此方法的元素数。我想Stream在斐波那契数达到某个值后停止生成。

我的意思是,如果我想列出所有小于 1000 的斐波那契数,那么我不能使用limit,因为我不知道可能有多少斐波那契数。

有没有办法使用 lambda 表达式来做到这一点?

0 投票
2 回答
702 浏览

java - 终端操作(例如 forEach)可以重新抛出已检查的异常吗?

我有一个删除一些文件的方法:

try/catch 块降低了操作的可读性,尤其是与使用方法引用相比:

不幸的是,该代码无法编译。

有没有办法应用在终端操作中引发检查异常并简单地“重新引发”任何异常的操作?

我知道我可以编写一个包装器,将检查的异常转换为未经检查的异常,但如果可能的话,我宁愿坚持使用 JDK 中的方法。

0 投票
1 回答
113 浏览

java - 从地图中获取最高 n 个数字的最简洁方法?

我已经有以下内容:


这导致从枚举到“出现次数”的映射,因此EUR可以映射到10和。可能,计数可能相同。USD1

现在我有没有尽可能简洁并有能力使用java-8,得到InvoiceCurrency属于最高数字的那个?有没有一种简洁的方法来查看排序整数计数的前 2 个实际上具有相同的值?

我知道我可以用循环等方式对其进行编程,但我希望依靠这种java-8精神来编写最可维护的代码。

0 投票
1 回答
3909 浏览

java - Java 8 流 int 和 Integer

刚刚用 Java 8 弄脏了我的手,偶然发现了如下行为 -

输出是:

而我期望代码在这两种情况下都打印所有 int 和 Integer?对此的任何见解都会非常有帮助......

0 投票
1 回答
76 浏览

java - 如何将 FibSupplier 变成通用的 FiniteSupplier?

考虑到我有以下课程:

如果你看一下FibSupplier你会发现它暴露了一个普遍的问题,即使它在这里有一个专门的实现,我设法提取的是:

  • 它有一个Predicate.
  • 它具有初始变量。
  • 它有一个需要由谓词测试的变量。
  • 它有一个自定义next()方法。

我尝试通过以下方式来概括这一点,请注意,我现在使用通用版本而不是专用整数版本:

我希望能够FiniteSupplier用 a调用predicate,但是现在我真的不知道如何实现我设法提取的其他要求。我知道可以通过扩展FiniteSupplier和使其抽象来完成,但这是正确的方法吗?

0 投票
4 回答
13340 浏览

java - 如何创建无限流出一个迭代器?

看看我所做的以下课程:

以及它的用法:

我怎样才能创造无限 Stream<E>

如果我要使用Stream<Integer> infiniteStream = toList(FibonacciSupplier.infinite()).stream(),我可能会令人惊讶地永远不会获得无限流。相反,代码将在底层方法
的创建中永远循环。list

到目前为止,这纯粹是理论上的,但如果我想首先跳过无限流中的前 x 个数字,然后将其限制为最后 y 个数字,我可以肯定地理解它的必要性,例如:

代码永远不会返回结果,应该怎么做?

0 投票
2 回答
11968 浏览

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,但我认为这不会影响性能很多):

0 投票
2 回答
1889 浏览

java - 转换列表到地图计算发生次数

我正在玩 Java 8,我知道这必须通过阅读文档来实现,我只是不知道该怎么做。

我有以下工作代码:

重要的部分是我有一个List<Long>可能在某些数字有重复的Long数字。

现在我想将它转换为一个Map<Long, Long>作为键的元素和作为值的出现。

我以为:

会工作,但它不会。我在 java.util.stream.Collectors 文档中查找了示例。

我需要如何使用这些功能?