【问题标题】:Is there any way in java to return the same collection type after using stream on the collection?在集合上使用流后,java中有什么方法可以返回相同的集合类型?
【发布时间】:2021-07-20 03:24:51
【问题描述】:

我想对一个集合进行操作,得到一个与原来同类型的映射集合。

这是我迄今为止尝试过的:

public <Ty extends Collection<Value>> Ty getClone(Ty c) {
    return c.stream().map(this::getClone).collect(Collectors.toCollection(c::new)); //Cannot resove constructor 'Ty'
}

我尝试使用的泛型类型是否可行?如果是,我将如何改变我的方法?

【问题讨论】:

  • 您是否尝试使用this::getClone 递归调用该方法?
  • 啊其实不是,那是另一个恰好同名的函数:)

标签: java generics java-stream


【解决方案1】:

你不能用你当前提供的参数来做到这一点。

如果你传入一个Supplier&lt;Ty&gt;(或者,更一般地,一个Supplier&lt;? extends Ty&gt;),你就可以做到:

public <Ty extends Collection<Value>> Ty getClone(Ty c, Supplier<? extends Ty> supplier) {
    return c.stream().map(this::getClone).collect(Collectors.toCollection(supplier));
}

【讨论】:

  • 注意,.map(this::getClone) 可能是一个递归调用。
  • @Naman 需要将Value 分配给Ty extends Collection&lt;Value&gt;,这很难实现且几乎没有实际用途。使用内置的克隆操作创建一个真正的树节点类型会更有意义。
【解决方案2】:

没有。这是不可能的,因为你已经写了。

在 Java 中,您的集合可能根本不支持此操作。它可能是一个实现单个集合的类,并且永远不能用于其他任何事情。这并不常见,但肯定有可能。

您当然可以传递自己的Supplier。或者您可以对您想要支持的每种集合类型执行instanceof 并明确创建您自己的供应商,如果它不是可识别的类型,则抛出。但是,您所描述的 API 无法完全概括。

【讨论】:

    猜你喜欢
    • 2015-03-22
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多