【发布时间】:2020-09-09 15:53:39
【问题描述】:
假设我有以下三个数组:
int r[] = {255,255,255};
int g[] = {0,0,0};
int b[] = {255,255,255};
所有数组长度相同。
我想将它们转换成 Color 类型的对象数组:
public class Color {
int r,g,b;
public Color(int r, int g, int b) {
this.r = r;
this.g = g;
this.b = b;
}
}
Color[] arr = new Color[3];
每个索引将包含来自 3 个数组的同一索引的 r、g、b。例如,假设Color[1] = new Color(r[1],g[1],b[1]);
如何使用 Java Streams 做到这一点?
代码的for循环变体是:
Color arr[] = new Color[r.length];
for(int i=0;i<r.length;i++) {
Color c = new Color(r[i],g[i],b[i]);
arr[i] = c;
}
有没有办法使用流来做到这一点?
【问题讨论】:
-
您真正需要的是
zip流上的操作,was considered but proved impractical 因为并行和潜在无限流的复杂性。使用流而不是 for 循环并没有太大的优势;循环更高效,可读性更强。 -
@chrylis-cautiouslyoptimistic- 我不了解你,但 Ousmane D 的回答非常好。
-
@chrylis-cautiouslyoptimistic- 即使有
zip用于原始类型甚至对象类型......我认为它不会比任何建议的更好解决这种特定类型的问题主要是因为zip一次对 两个源 进行操作,正如您在 OPs 中看到的那样,理想情况下,您可以在单个函数中对所有源进行操作的解决方案是好多了。 -
@chrylis-cautiouslyoptimistic-of-of-course 如果对 三个 源或更多源有
zip操作(对于原语),那么这肯定是我的 OP手头的问题! :)。但是是的,我同意 OPs 方法绝对是惯用的 non-functional 方法。
标签: java arrays java-stream