如何将 toArray 结果转换为 CompletableFuture<Texture>[] 类型? [复制]
Posted
技术标签:
【中文标题】如何将 toArray 结果转换为 CompletableFuture<Texture>[] 类型? [复制]【英文标题】:How to convert toArray result to a CompletableFuture<Texture>[] type? [duplicate] 【发布时间】:2020-07-24 15:50:11 【问题描述】:我查看了几十个答案,但他们所做的大多是建议string::new
或类似的技巧。就我而言,我要转换的类型是CompletableFuture<Texture>
。这是这个 POJO:
class ARObject
CompletableFuture<Texture> texture;
void setTexture(CompletableFuture<Texture> texture)
Log.d(TAG, String.format("Texture set for %d", resourceId));
this.texture = texture;
CompletableFuture<Texture> getTexture()
return texture;
由于重构,arObjectList
现在是一个数组。
private ARObject[] arObjectList =
...
;
(显然这是一种简化,对象有更多字段)。我想要的只是获取CompletableFuture<Texture>
的数组,这样我就可以将它传递给CompletableFuture.allOf(...)
。这是我想要的:
CompletableFuture<Texture>[] texturePromises = Stream.of(arObjectList).map(ARObject::getTexture).toArray();
CompletableFuture.allOf(texturePromises)
但是根据 IDE,toArray
返回 am Object[]
。 CompletableFuture<Texture>::new
生成器不起作用,但无论如何这不是一个好主意,我们不想重新分配或弄乱这些期货。只需返回它们的数组。传递 new CompletableFuture<Texture>[arObjectList.length]
不会编译。
除非您完全确定并且可以指出解决方案,否则不要将此问题标记为重复。我阅读了十几个条目。
【问题讨论】:
上述假设的重复问题中没有一个答案是相同的。有一些变化,但不一样。 【参考方案1】:arObjectList
是一个列表吗?那么显然是arObjectList.size()
;不是arObjectlist.length
。
一般来说,混合泛型和数组是行不通的。考虑过时的数组,尤其是非原始数组。如果您尝试将两者混合使用,则会出现“痛苦”(从某种意义上说,您必须跳过障碍,可能会陷入导致警告的“原始类型”)。
一般来说,你不能创建包含泛型的数组;这是一个限制。您可以做的是制作一个原始类型的数组并进行强制转换。
Object o = new List<String>[10]; // illegal
List<String>[] o = (List<String>[]) new List[10]; // legal, but warnings
因此,类似于:
CompletableFuture<Texture>[] texturePromises = (CompletableFuture<Texture>[]) Stream.of(arObjectList).map(ARObject::getTexture).toArray(CompletableFuture[]::new);
将完成这项工作。带有警告。警告是无法避免的;真正的解决方案是停止对大多数事情使用数组;当然不要在这里使用它们。
【讨论】:
哦,我现在一直在重构这个,虽然它被命名为列表,但它现在实际上是一个数组:private ARObject[] arObjectList =
。原因是CompletableFuture.allOf(
只是将数组解包为一系列参数(这是它所期望的)。我很乐意将其转换回列表。我想要的只是一种从 POJO 系列中提取 Futures 列表的简单方法,然后将其传递给 CompletableFuture.allOf
或其他方式等待所有 futures 完成。
我可以省略 toArray 表达式中的显式转换:CompletableFuture<Texture>[] texturePromises = Stream.of(arObjectList).map(ARObject::getTexture).toArray(CompletableFuture[]::new);
。我同意它仍然很丑,所以如果有更好的东西我很乐意重构。以上是关于如何将 toArray 结果转换为 CompletableFuture<Texture>[] 类型? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何修复 sklearn fit_transform 上的“X.toarray() 以转换为密集的 numpy 数组”错误?