如何将 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&lt;Texture&gt;。这是这个 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&lt;Texture&gt; 的数组,这样我就可以将它传递给CompletableFuture.allOf(...)。这是我想要的:

CompletableFuture<Texture>[] texturePromises = Stream.of(arObjectList).map(ARObject::getTexture).toArray();
CompletableFuture.allOf(texturePromises)

但是根据 IDE,toArray 返回 am Object[]CompletableFuture&lt;Texture&gt;::new 生成器不起作用,但无论如何这不是一个好主意,我们不想重新分配或弄乱这些期货。只需返回它们的数组。传递 new CompletableFuture&lt;Texture&gt;[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&lt;Texture&gt;[] texturePromises = (CompletableFuture&lt;Texture&gt;[]) Stream.of(arObjectList).map(ARObject::getTexture).toArray(CompletableFuture[]::new);

将完成这项工作。带有警告。警告是无法避免的;真正的解决方案是停止对大多数事情使用数组;当然不要在这里使用它们。

【讨论】:

哦,我现在一直在重构这个,虽然它被命名为列表,但它现在实际上是一个数组:private ARObject[] arObjectList = 。原因是CompletableFuture.allOf( 只是将数组解包为一系列参数(这是它所期望的)。我很乐意将其转换回列表。我想要的只是一种从 POJO 系列中提取 Futures 列表的简单方法,然后将其传递给 CompletableFuture.allOf 或其他方式等待所有 futures 完成。 我可以省略 toArray 表达式中的显式转换:CompletableFuture&lt;Texture&gt;[] texturePromises = Stream.of(arObjectList).map(ARObject::getTexture).toArray(CompletableFuture[]::new);。我同意它仍然很丑,所以如果有更好的东西我很乐意重构。

以上是关于如何将 toArray 结果转换为 CompletableFuture<Texture>[] 类型? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 sklearn fit_transform 上的“X.toarray() 以转换为密集的 numpy 数组”错误?

如何使用自定义键值名称将映射列转换为结构类型?

laravel怎么把对象转换为数组

node.js 中 MongoDB cursor.toArray() 的替代方案

将枚举转换为集/列表

怎么将arraylist转换为字符串数组