Wic*_*koo 3 java java-8 java-stream flatmap
我们考虑一下我有以下课程:
class A {
int i, j, k;
public A(int i, int j, int k) {
this.i = i; this.j = j; this.k = k;
}
}
Run Code Online (Sandbox Code Playgroud)
其中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())
Run Code Online (Sandbox Code Playgroud)
首先,它太冗长了.有没有办法缩短它?特别是我无法找到一个range
上Stream.其次,编译器无法确定返回类型的类型.它认为它
List<Object>不是预期的List<A>.我该如何解决这个问题?
一种使用方式 range是在之后执行拳击转换:
List<A> list=IntStream.range(0, r_i).boxed()
.flatMap(i -> IntStream.range(0, r_j).boxed()
.flatMap(j -> IntStream.range(0, r_k)
.mapToObj(k -> new A(i, j, k)))).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
它不是最漂亮的代码,但IntStream.range(0, max).boxed()仍比Stream.iterate(0, n -> n+1).limit(max)... 更好
一种替代方法是使用实际展平操作而不是嵌套操作:
List<A> list=IntStream.range(0, r_i).boxed()
.flatMap(i -> IntStream.range(0, r_j).mapToObj(j -> new int[]{i,j}))
.flatMap(ij -> IntStream.range(0, r_k).mapToObj(k -> new A(ij[0], ij[1], k)))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
我看到的主要缺点是它缺少一个IntPair或Tuple<int,int>类型.所以它使用数组作为解决方法.
| 归档时间: |
|
| 查看次数: |
1013 次 |
| 最近记录: |