【发布时间】:2015-03-04 07:48:06
【问题描述】:
假设我有以下课程:
class A {
int i, j, k;
public A(int i, int j, int k) {
this.i = i; this.j = j; this.k = k;
}
}
其中i、j、k 具有已知范围:r_i、r_j、r_k。现在我想生成
此范围内所有可能的A 实例。我可以想出类似的东西:
Stream.iterate(0, n -> ++n).limit(r_i)
.flatMap(i -> Stream.iterate(0, n -> ++n).limit(r_j)
.flatMap(j -> Stream.iterate(0, n -> ++n).limit(r_k)
.map(k -> new A(i, j, k)))).collect(Collectors.toList())
首先,它太冗长了。有没有办法缩短它?特别是我找不到range
在Stream。其次,编译器无法确定返回类型的类型。它认为它是
List<Object> 而不是预期的 List<A>。我该如何解决?
【问题讨论】:
-
您可能想先查看
IntStream.range。 -
@JonSkeet 我试过了,但还有其他问题。那里的 flatMap 不允许任意返回类型,只有整数。有一个尴尬的mapToObj方法,但是我没有找到flatmapToObj。
-
这绝对可以用
IntStream.range和mapToObj结尾。您确定您的编译器会抱怨还是只是您的 IDE?我刚刚在 IntelliJ IDEA 14 中复制了您的代码,它没有显示任何警告或错误或任何类型。 -
@Ali 我确实做到了,而且效果很好。我正在使用 Java 8 Build 20 和 IntelliJ 14。
-
@Ali 是的,我也可以让它工作。这不是类型推断的问题。 Java 编译器做得很好,但是许多 IDE 在这方面充满了错误。 Intellij 14 刚刚发布时在这方面存在很多问题,并且随着每个新版本的发布,它们都得到了很大的改进。我想,开发人员一直在研究他们自己的 IDE 类型推断算法,试图尽可能地模拟编译器的功能。但是很可能这里和那里仍然存在错误。随着时间的推移,这会变得更好,但你应该最终相信你的编译器,而不是 IDE。
标签: java java-8 java-stream flatmap